OpenGL:将物体平移到原点

3

我有一个汽车模型,其中不同的汽车部件被描述在顶点组中。


1
单位矩阵不会移动它。这里的“单位”是指“相同的”:完全不改变位置。使用@ChrisF的转换矩阵将每个轮胎从其中心移动到原点,然后再移回来。 - LarsH
3个回答

8

您知道轮胎的当前位置,因此可以使用从单位矩阵和取反位置构建的转换矩阵将其转换到原点:

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

这是原帖发布者。感谢回复。如果我有一堆构成轮胎的顶点,我该如何找到这些顶点的中心点?我猜这些转换矩阵中的x y z值就是它。我需要为我的轮胎定义一个向量基础吗? - TheGambler
@TheGambler:查找轴对齐边界框(AABB)。找到您的轮胎顶点的AABB。该框的中心通常很适合作为您的轮胎中心。对于更奇异形状的物体,您可能希望使用质心,这更加复杂。在这些情况下,通常应由艺术家将模型居中放置在适当位置,或者至少添加一些可导出的标记以标记该位置。 - Alan

1
你可能想要查看 glPushMatrix() 和 glPopMatrix()。glPushMatrix() 将保存您之前使用的任何平移/缩放/旋转操作(即您的旧模型视图矩阵)。当您推送旧的模型视图矩阵时,您将在原点工作。然后,您可以对当前正在绘制的任何内容执行任何新的平移/旋转/缩放操作。最后,调用 glPopMatrix()。这将重新加载您的旧模型视图矩阵。这是考虑这些操作的最清洁和最简单的方法。
glPushMatrix();
// at this point you're working at the origin
// translate the tire here
// rotate the tire here
glPopMatrix();

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

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);

tire_speed 是轮胎旋转速度,global_tire_rotate 是轮胎相对于汽车的旋转角度。global_car_rotate 是汽车(以及其上的物体如车轮)相对于 z 轴的旋转角度。*_translate_factor 是汽车在您场景中的位置。它对我很有效,希望对您也有效;)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接