2010-10-12 58 views
3

我有一个汽车模型,用顶点组描述汽车的不同部分。OpenGL:将对象转换为原点

+1

身份矩阵根本不会移动它。 *身份*在这里是“相同”的意思:根本不要改变立场。使用@ ChrisF的翻译矩阵将每个轮胎从中心移动到原点和后面。 – LarsH 2010-10-12 21:47:43

回答

6

你知道轮胎的当前位置,使您在使用从单位矩阵和否定的位置建了平移矩阵将其翻译为原点:

1 0 0 -x 
0 1 0 -y 
0 0 1 -z 
0 0 0 1 

然后旋转,然后应用正向转换放回:

1 0 0 x 
0 1 0 y 
0 0 1 z 
0 0 0 1 
+0

这是原始的海报。感谢您的回应。如果我给了一堆组成轮胎的顶点,我该如何找到这些顶点的中心点?我猜这就是这些翻译矩阵中的x y z值。我需要为我的轮胎定义一个向量基础吗? – TheGambler 2010-10-12 23:55:52

+0

@ TheGambler:查看轴对齐边界框(AABB)。找到轮胎顶点的AABB。那个盒子的中心通常通常可以很好地工作在轮胎的中心。对于更奇怪的形状的物体,你可能会想要质心,这是更复杂的计算。在这些情况下,艺术家的工作通常是将模型置于适当的位置,或者至少添加一些可导出的标记来标记该位置。 – Alan 2010-10-14 15:05:44

0

下面是代码:

glTranslatef(x_translate_factor,y_translate_factor,z_translate_factor); 
glRotatef(global_car_rotate,0,1,0) ; 
glRotatef(global_tire_rotate,0,1,0); 
glRotatef(tire_speed,1,0,0); 

当轮胎速度是轮胎旋转速度时,global_tire_rotate是轮胎相对于汽车的旋转。 Global_car_rotate是汽车(以及诸如车轮之类的物体)相对于z轴的旋转。 * _translate_factor是车内的位置。它对我来说工作得很好,希望它对你有用;)。

1

您可能想要查看glPushMatrix()和glPopMatrix()。 glPushMatrix()将保存您之前使用的任何平移/缩放/旋转操作(即您的旧模型视图矩阵)。当你推动旧的模型视图矩阵时,你将在原点工作。然后,您可以执行任何新的翻译/旋转/缩放操作,以适应您目前绘制的任何内容。最后,你调用glPopMatrix()。这将重新加载您的旧模型视图矩阵。这是考虑这些操作的最简单和最简单的方法。

glPushMatrix(); 
// at this point you're working at the origin 
// translate the tire here 
// rotate the tire here 
glPopMatrix(); 

一般来说,这是定位你正在绘制的东西的好方法。