中间的正方形是用正投影画出的立方体(这里立方体的意思是“四边相等”)。从左下角到中心的形状也是一个立方体,但用透视投影绘制!
显然,这并不是看起来不像一个立方体。下面是我的代码(它有点aa墙,所以我把它拆开了):
public class OpenGL
{
//width and height of the screen, plus the depth of the 3d space
public static final int WIDTH = 800, HEIGHT = 600, DEPTH = 1000;
//called once at startup
private static void initGl()
{
GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glEnable(GL11.GL_BLEND);
GL11.glEnable(GL11.GL_DEPTH_TEST);
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
GL11.glViewport(0,0,WIDTH,HEIGHT);
GL11.glDepthFunc(GL11.GL_LESS);
GL11.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_FILL);
GL11.glClearColor(0,0,0,0);
GL11.glShadeModel(GL11.GL_SMOOTH);
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GL11.glOrtho(0, WIDTH, HEIGHT, 0, DEPTH, -DEPTH);
GL11.glMatrixMode(GL11.GL_MODELVIEW);
DEFAULT_FONT.addAsciiGlyphs();
DEFAULT_FONT.addGlyphs(400, 600);
DEFAULT_FONT.getEffects().add(new ColorEffect(java.awt.Color.WHITE));
try
{
DEFAULT_FONT.loadGlyphs();
}
catch (SlickException e)
{
e.printStackTrace();
}
}
}
这些都在另一个类中,每秒调用30次。
//main rendering function.
public void render()
{
//these two just input values for different variables, allowing for
//movement of the camera and testing different values of znear and zfar.
//nothing OpenGL-related is changed.
update();
updatePerspectiveTest();
GL11.glMatrixMode(GL11.GL_MODELVIEW);
p.render(); //draws the normal cube, the "player"
if (perspective)
{
perspective();
}
GL11.glMatrixMode(GL11.GL_MODELVIEW);
loadRotationalMatrix(yaw,pitch,roll);
loadPositionalMatrix(-y,-x,-z);
env.render(); //draws the distorted cube, the "environment"
GL11.glLoadIdentity();
ortho();
//render debug data
}
//resets to orthographic projection
public static void ortho()
{
int i = GL11.glGetInteger(GL11.GL_MATRIX_MODE);
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GL11.glOrtho(-OpenGL.WIDTH/2, OpenGL.WIDTH/2,
OpenGL.HEIGHT/2, -OpenGL.HEIGHT/2, OpenGL.DEPTH/2, -OpenGL.DEPTH/2);
GL11.glMatrixMode(i);
}
//activate perspective projection. Maybe something wrong here?
public static void perspective()
{
int i = GL11.glGetInteger(GL11.GL_MATRIX_MODE);
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GL11.glFrustum(-OpenGL.WIDTH/2, OpenGL.WIDTH/2,
OpenGL.HEIGHT/2, -OpenGL.HEIGHT/2,
pzNear, pzFar);
GL11.glMatrixMode(i);
}
//translates the camera via matrix multiplication.
public static void loadPositionalMatrix(float x, float y, float z)
{
FloatBuffer m = BufferUtils.createFloatBuffer(16);
m.put(new float[]
{
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
x, y, z, 1
});
m.flip();
GL11.glMultMatrix(m);
}
//sets yaw, pitch and roll using rotational matrices. Not really being used now.
public static void loadRotationalMatrix(double pitch, double yaw, double roll)
{
FloatBuffer Ry = BufferUtils.createFloatBuffer(16);
FloatBuffer Rx = BufferUtils.createFloatBuffer(16);
FloatBuffer Rz = BufferUtils.createFloatBuffer(16);
Rx.put(new float[]
{
1, 0, 0, 0,
0, (float) cos(pitch), (float) sin(pitch), 0,
0, (float) -sin(pitch), (float) cos(pitch), 0,
0, 0, 0, 1
});
Ry.put(new float[]
{
(float) cos(yaw), 0, (float) -sin(yaw), 0,
0, 1, 0, 0,
(float) sin(yaw), 0, (float) cos(yaw), 0,
0, 0, 0, 1
});
Rz.put(new float[]
{
(float) cos(roll), (float) sin(roll), 0, 0,
(float) -sin(roll), (float) cos(roll), 0, 0,
0, 0, 1, 0,
0, 0, 0, 1
});
Rx.flip();
Ry.flip();
Rz.flip();
GL11.glMultMatrix(Rz);
GL11.glMultMatrix(Ry);
GL11.glMultMatrix(Rx);
}
我已经使用了zNear和zFar,但是到目前为止,我所尝试的值都没有得到正确的投影。
具体的问题是:为什么第二个立方体出现如此可怕的扭曲,我可以做什么来纠正它?
矩阵使用裁剪平面从3D环境投射到屏幕上。所以x和y裁剪平面需要考虑窗口的宽高比和视场。所以你应该有这样的东西:
...
double fovyInDegrees = 50; // Change this if you want.
double ymax, xmax, aspectRatio;
aspectRatio = OpenGL.WIDTH / OpenGL.HEIGHT;
ymax = znear * Math.tan(fovyInDegrees * Math.PI / 360);
xmax = ymax * aspectRatio;
GL11.glFrustum(-xmax, xmax, -ymax, ymax, znear, zfar);
...
请注意,我刚刚将一些C++代码更改为Java,所以没有对其进行测试。它在我的代码中工作,所以应该没问题。
嘿,我已经开始使用JOGL了,除了使用FloatBuffer矩阵时,我的创作在y轴上被扭曲了之外,一切都很顺利。 y轴畸变图片 它应该看起来像下面的图片,但目前我不能使它这样做,而仍然被允许移动。 它应该是什么样子的图片 我看到几年前,有人有这个问题(但关于z轴),但我无法使用他们给出的更正来解决我的问题。这是链接:Link 谢谢你抽出时间
使用我的代码,当我旋转ModelView时;它单独旋转每个对象。 我试图旋转整个视图平面。我怎么能那么做? 渲染器称为每个并图框
我刚刚实现了基本的opengl渲染到我的pyplay应用程序中,认为硬件加速会使程序运行得更快。相反,它要慢得多。 看起来问题是绘图功能。 这是我的opengl绘图功能 我的分析器为draw函数提供了什么 我的分析器文本的其余部分:(1个月后到期) http://pastebin.com/ApfiCQzw 我的源代码 https://bitbucket.org/claysmithr/warbots
我的屏幕上有一个旋转和平移的对象,但是我有两个关于z轴旋转的问题。解释起来有点棘手,所以我上传了两个视频来描述每个问题。 1) 反向旋转:在绕x轴旋转对象后,z轴旋转将被反向,并且应该如此。 2)错误的Z轴旋转:同样,在围绕x轴旋转物体后,我试图围绕z轴旋转物体,旋转导致不同的轴旋转。 我相信视频很好地描述了这些问题。 编辑:更新#1 好的,我想我找到了解决方案,就是只绕Z轴旋转相机,然后对模型本
问题内容: 如何在单个场景中检测到多个关键事件?我需要我的程序来检测何时同时按下空格键 和 向右箭头键。 前三个表达式查找单个键并正常工作。最终表达式永远不会返回true。我相信只有最新的键事件才传递给处理程序。 我查看了KeyCodeCombination,但是这似乎适用于键具有指定列表(ALT_DOWN,SHIFT_DOWN等)中的修饰键的情况。 我可以使用FX中的实用程序吗? 问题答案: 试