- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想要解决的任务很简单:加载纹理化 OBJ 文件并显示它,使其占用最大的图像空间。只要相机向下看负 z 轴且 y 轴是向上向量,就不需要旋转网格。我正在使用 pyglet 来做到这一点。
为了将相机设置到所需的位置,我执行以下操作(代码见下文):计算网格的边界球,该边界球由网格的中心和距最远点的半径定义中心。然后我按照解释计算截锥体,例如here并相应地设置正交投影。然后我使用 gluLookAt 来更新 modelviewmatrix,如下所示:相机位于正 z 轴上,朝向网格中心,y 轴是向上向量。
问题是我的渲染图像看起来完全不像我期望的那样,例如网格中心不在图像的中心,如下图所示。该图像显示了边界框和源自网格计算中心的坐标轴(红色:x 轴,绿色:y 轴,蓝色:z 轴)。
设置相机的代码是:
# get the bounding sphere
center, radius = self._mesh.compute_bounding_sphere()
diam = radius*2.0
print 'center:'
print center
print 'radius: %f' % radius
# set up near and far clipping plane
z_near = 1.0
z_far = z_near + diam
# construct params for orthographic projection matrix
left = center[0] - radius
right = center[0] + radius
bottom = center[1] - radius
top = center[1] + radius
# if we are not rendering a square image, must correct for aspect ratio
aspect_ratio = float(self.width) / float(self.height)
if aspect_ratio < 1.0:
bottom /= aspect_ratio
top /= aspect_ratio
else:
left *= aspect_ratio
right *= aspect_ratio
print 'znear %f, zfar %f' % (z_near, z_far)
print 'left %f, right %f' % (left, right)
print 'bottom %f, top %f' % (bottom, top)
# specify a parallel projection with clipping planes as computed above
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
glOrtho(left, right, bottom, top, z_near, z_far)
# gluPerspective(50.0, aspect_ratio, z_near, z_far)
# construct a viewing transform as follows: we look at the center of the mesh, the eye is located on the
# positive z-axis, and the 3D y-axis is the up-vector, i.e. it will be mapped to the y-axis in image space.
eye = center[2] + radius
print 'eye:'
print eye
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
gluLookAt(0.0, 0.0, eye, center[0], center[1], center[2], 0.0, 1.0, 0.0)
打印内容
center:
[ 8.51203675 -1.95199815 0.35396978]
radius: 10.462382
znear 1.000000, zfar 21.924764
left -1.950345, right 18.974419
bottom -12.414380, top 8.510384
eye:
10.8163515441
你能帮我找出我做错了什么吗?
最佳答案
There is no need to rotate the mesh as long as the camera is looking down the negative z-axis and the y-axis is the up vector.
您的相机没有俯视 z
轴:
gluLookAt(0.0, 0.0, eye, center[0], center[1], center[2], 0.0, 1.0, 0.0)
这将引入旋转,以便世界空间中的相机方向为(center[0], center[1], center[2] - eye) = (center[0], center[1] ,-半径)
。
由于您已经根据对象移动了 View 体积,因此注视点将不是出现在屏幕中心的点。你实际上需要做的只是沿着-z
看,你只需要沿着+z
平移相机:
gluLookAt(0.0, 0.0, eye, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0)
请注意,从概念上讲,您的用例根本不需要 View 矩阵。您可以计算包围对象的轴对齐边界框,并可以直接将其用作 View 体积的参数(就像您对 x
和 y
所做的那样,但对于某些原因,不适合 z
)。唯一的技巧是您需要对 near
和 far
的值取反,因为 glOrtho
的设计方式。
关于python - 为什么我的渲染图像没有显示我期望使用 gluLookAt 看到的 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42552285/
我在 OpenGL 的天空盒内制作过山车,并且没有太多关于它的功能或计算机图形的背景知识,这被证明是非常困难的。我使用 Catmull-Rom 样条插值绘制了一个过山车,并使用 glVertex3f
我正在尝试制作一个在 3D 空间中自由移动的相机。 glulookat 函数如下所示: gluLookAt(g_eye[0],g_eye[1],g_eye[2], g_look
我正在尝试将我的太空入侵者游戏切换为第一人称视角,即从船上看世界的视角。我对应该关注什么点感到有点困惑。我目前在 gluLookAt 中使用这些参数: GL11.glMatrixMode(GL11.G
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 Improve th
我正在尝试使用 gluLookAt() 函数来控制放大和缩小。现在它根本没有改变矩阵,我不知道为什么。 相关代码如下: // Basic Opengl display function void on
我没有多少 OpenGL 经验。我正在尝试画一个茶壶并在茶壶周围移动相机。为此,我使用了 gluLookAt 函数。问题是,当我调用 gluLookAt 时,屏幕是空白的,我看不到我的茶壶。 #inc
我刚买了一台新电脑,现在必须让我的演示程序与 SDL2/OpenGL 一起运行。我使用该程序尝试了各种技术并使用了 gluLookAt(显然,不应该再使用它,甚至永远不应该使用它)。 现在我正在寻找一
我使用 Eclipse 在 OpenGL 中创建了一个保龄球游戏。 现在我想在按下按键时更改相机的 View 。 但是当我按下 x 按钮时,一切都消失了。 这里是我们的代码:- #include #
我正在用 opengl 编程,我想更改相机 View : ... void RenderScene() //Zeichenfunktion { glClearColor( 1.0, 0.5, 0.0
伪代码: drawScene() { for(every 3Dobject) { glMatrixMode(GL_MODELVIEW); glLoadIdent
这就是我计算视线 vector 和向上 vector 的方式。 ly = sin(inclination); lx = cos(inclination)*sin(azimuth);
我正在使用 openGL/GLUT 只是想绘制一个图元并使用 gluLookAt() 来移动相机。遇到麻烦,我只看到黑色。这是我的渲染函数代码。 glMatrixMode(GL_MODELVIEW);
为什么 gluLookAt 不工作? 它对场景没有任何影响,就好像它甚至没有被调用一样。 是因为我正在使用 glMatrixMode(GL_MODELVIEW); 如果我不包含它,屏幕上什么也看不到。
我有一个 OpenGL 程序,当我调用它时它可以工作: gluLookAt(0.1,0.1,0.1, 0,0,0, 0,0.1,0); ...但不是当我这样称呼时: gluLookAt(0.01,0.
通过这条指令 gluLookAt: gluLookAt( p1, p2, p3, l1, l2, l3, u1, u2, u3 ); 如何将相机向左移动一个单位,同时保持注视同一点的方向? 显然我不能
我正在尝试使用 gluLookAt() 设置视角 这里有我的代码,我尝试在其中设置相机但没有结果 这里的函数displaycone(): void displayCone(void) { gl
我想使用 Camera 外部矩阵和 gluLookAt 函数在图像上显示模型。 模型平移到原点,即模型的质心位于原点。 (模型坐标系以右手为准) 然后使用 cvFindExtrinsicCameraP
我尝试自己计算观察矩阵,而不是使用 gluLookAt()。我的问题是我的矩阵不起作用。然而,在 gluLookAt 上使用相同的参数确实有效。 我创建观察矩阵的方法: Vector3 Eye, At
据我了解, gluLookAt( eye_x, eye_y, eye_z, center_x, center_y, center_z, up_x,
我正在开发一个简单的 2D 自上而下 OpenGL 游戏,其中相机跟随玩家。我使用 gluLookAt 将相机定位在玩家上方并朝其方向看。然而,在运行游戏时,即使没有输入,相机也会围绕轴旋转。 旋转速
我是一名优秀的程序员,十分优秀!