1

我在不同的坐标系中有 2 个对象:行星和圆柱体。我有两个物体的眼睛坐标。我想沿着连接它和行星的向量来定位圆柱体。

沿红色矢量定位圆柱体

  glLoadMatrixf( PlanetTransform);
  // .. draw planet
  glLoadMatrixf( CylinderTransform);
  glColor3f(0, 1, 0);
  DrawCylinder();

  // draw vector that connects cylinder and planet
  glColor3f(1, 0, 0);
  glLoadIdentity();
  glBegin(GL_LINES);
     // planet eye pos e.g. (0.045; -0.049; -0.186)
     glVertex3f(point1.x, point1.y, point1.z);
     // cylinder eye pos e.g. (-0.109; -0.064; -0.203)
     glVertex3f(point2.x, point2.y, point2.z);
  glEnd();

  // orient cylinder along red vector
  // TVector normal(0, 0, 1);
  glLoadIdentity();
  gluLookAt(point2.x, point2.y, point2.z,
     point1.x, point1.y, point1.z,
     normal.x, normal.y, normal.z);

  DrawCylinder();

绘制圆柱代码:

  void DrawCylinder()
  {
  glPushMatrix();
  glRotatef(90, 1, 0, 0);
  gluCylinder(gp_quadratic, 0.01, 0, 0.03, 15, 15);
  glPopMatrix();
  }

我还尝试将 normal 指定为:

  TVector normal;
  TVector::cross(point2 - point1, TVector(0, 0, 1), normal);

所以最后我希望看到 2 个气缸 - 1 个绿色,1 个 - 红色。红色应沿红色段定向。但我没有看到红色的。你能帮我找出这里有什么问题吗?红色圆柱没有出现在绿色圆柱坐标系的中心。

4

1 回答 1

0

gluCylinder(/**/)

  1. 沿局部 z 轴构建,因此沿红线向外指向
  2. 局部 y 轴是全局 z 轴(指向观察者),投影到行星的观察平面上
  3. 因此,局部 x 轴大致沿着行星的观察平面向上倾斜
  4. 因此在 glRotatef(90, 1, 0, 0); 圆柱体远离用户指向图片的深处,并隐藏在行星后面
  5. 因此,如果改为 glRotatef(180, 1, 0 ,0 ); 使用,一切都应该没问题。

我身后有一个相当多的夜班,所以我的视力可能有缺陷,但尝试这样做很便宜,不是吗。

如果我错了,请尝试对行星使用 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE),然后查看圆柱体的位置。

于 2014-06-28T11:17:42.643 回答