首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpenGL绘制多个等轴测立方体

OpenGL绘制多个等轴测立方体
EN

Stack Overflow用户
提问于 2013-04-12 04:45:18
回答 2查看 1.4K关注 0票数 0

我试着在一个等轴测的相机角度画多个立方体。下面是绘制一个的代码。(在iOS上使用GLKit的OpenGL ES 2.0 )。

代码语言:javascript
运行
复制
float startZ = -4.0f;

// position
GLKMatrix4 modelViewMatrix = GLKMatrix4Identity;    
modelViewMatrix = GLKMatrix4Translate(modelViewMatrix, location.x, location.y, location.z + startZ);

// isometric camera angle
modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, GLKMathDegreesToRadians(45), 1.0, 0, 0);
modelViewMatrix = GLKMatrix4Rotate(modelViewMatrix, GLKMathDegreesToRadians(45), 0.0, 1.0, 0);

self.effect.transform.modelviewMatrix = modelViewMatrix;

[self.effect prepareToDraw];
glDrawArrays(GL_TRIANGLES, 0, 36);

问题是它首先平移,然后旋转,这意味着如果有多个盒子,它们不会对齐(它们看起来像一串菱形链条。每个角都在适当的位置并旋转,以便角重叠)。

我试着改变顺序,使旋转在平移之前,但它们根本不显示。我的顶点数组被绑定到一个以原点为中心的单位立方体。

我真的不明白如何控制相机和物体分开。我在投影矩阵上折腾了一段时间,但没有得到它。据我所知,摄像头应该是用modelViewMatrix控制的,对吧?( "View“部分)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-12 07:01:29

你的‘相机’变换(模型视图)看起来是正确的,但是看起来你使用的是透视投影--如果你想等轴测,你需要改变你的投影矩阵。

它看起来像是在绘制对象时将摄影机旋转应用于每个对象。相反,如果你的用例如此简单,那么模拟一个2深的矩阵堆栈,这样你就只有你的相机矩阵和每个立方体的矩阵。

  1. 设置投影和相机矩阵-保留对相机矩阵的引用。每个立方体的
  2. 生成单独的立方体变换矩阵(可能只包括平移-没有旋转,以便立方体保持轴对齐-我认为这就是您要通过相机矩阵来设置立方体矩阵,并将其用作模型视图矩阵。

请注意,渲染的每个立方体的相机矩阵将保持不变,但模型视图矩阵将立方体的各个变换矩阵和相机矩阵合并到单个模型视图矩阵中。这相当于旧的矩阵堆栈方法glPushMatrixglPopMatrix (在GLES 2.0中不可用)。如果你需要更复杂的对象层次结构(其中立方体在它们的“局部”坐标空间中有子对象),那么你可能应该实现你自己的完整矩阵堆栈,而不是上面讨论的2层深度的等效堆栈。

票数 1
EN

Stack Overflow用户

发布于 2013-04-12 07:41:04

作为参考,这里有一篇文章帮助我理解它。它有点数学,但很好地直观地解释了事情。

http://db-in.com/blog/2011/04/cameras-on-opengl-es-2-x/

我最终保留了透视投影,因为我不想要真正的等轴测。关键是要按正确的顺序来做,因为移动相机与移动对象是相反的。请参阅评论和文章。工作代码:

代码语言:javascript
运行
复制
// the one you want to happen first is multiplied LAST
// camRotate * camScale * camTranslate * objTranslate * objScale * objRotate;

// TODO cache the camera matrix
// the camera angle remains the same for all objects
GLKMatrix4 camRotate = GLKMatrix4MakeRotation(GLKMathDegreesToRadians(45), 1, 0, 0);
camRotate = GLKMatrix4Rotate(camRotate, GLKMathDegreesToRadians(45), 0, 1, 0);
GLKMatrix4 camTranslate = GLKMatrix4MakeTranslation(4, -5, -4.0);
GLKMatrix4 objTranslate = GLKMatrix4MakeTranslation(location.x, location.y, location.z);

GLKMatrix4 modelViewMatrix = GLKMatrix4Multiply(camRotate, camTranslate);
modelViewMatrix = GLKMatrix4Multiply(modelViewMatrix, objTranslate);

self.effect.transform.modelviewMatrix = modelViewMatrix;

[self.effect prepareToDraw];
glDrawArrays(GL_TRIANGLES, 0, 36);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15958540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档