【问题标题】:OpenGL: Translate object to originOpenGL:将对象转换为原点
【发布时间】:2010-10-12 21:37:56
【问题描述】:

我有一个汽车模型,它在顶点组中描述了汽车的不同部分。

【问题讨论】:

  • 单位矩阵根本不会移动它。这里的身份是“相同”的意思:根本不改变位置。使用@ChrisF 的平移矩阵将每个轮胎从其中心移动到原点并返回。

标签: opengl graphics


【解决方案1】:

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

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:查找轴对齐边界框 (AABB)。找到轮胎顶点的 AABB。该框的中心通常可以很好地作为轮胎的中心。对于形状更奇怪的物体,您可能需要质心,这更难以计算。在这些情况下,艺术家的工作通常是让模型在适当的位置居中,或者至少添加一些可导出的标记来标记该位置。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    代码如下:

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

    其中tyre_speed 是轮胎旋转速度,global_tire_rotate 是轮胎相对于汽车的旋转。 Global_car_rotate 是汽车(以及带有它的物体,例如车轮)相对于 z 轴的旋转。 *_translate_factor 是汽车在您的场景中的 * 位置。它对我来说很好,希望对你有用;)。

    【讨论】:

      猜你喜欢
      • 2019-03-17
      • 1970-01-01
      • 2013-01-12
      • 1970-01-01
      • 2020-05-13
      • 2019-03-17
      • 2016-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多