gpt4 book ai didi

opengl - 如何在OpenGL中获取对象的坐标

转载 作者:行者123 更新时间:2023-12-02 10:39:05 26 4
gpt4 key购买 nike

我希望能够在平移和旋转对象后获取对象(例如三角形)的坐标,我这样做的原因是为了以后可以进行碰撞检测并使用坐标计算对象之间的距离。我想我可能必须使用gluProject,但不确定。还有不同坐标空间之间的区别是什么,例如世界,物体等

我下面有一些代码,它是正方形的中间的一个圆,我如何检测该圆何时碰到边缘之一,我可以使用向上,向下,向左,向右键将其移动一圈,只改变x或y坐标,但我只想能够进行一些基本的碰撞检测,而我却不知道该怎么做。

glPushMatrix();
glColor3f(0.0f, 1.0f, 0.0f);
glTranslatef(0.0f, 0.0f, -5.0f);

glScalef(0.5f, 0.5f, 0.0f);
glBegin(GL_POLYGON);
glVertex3f(-5.0f, -5.0f, 0.0f);
glVertex3f(5.0f, -5.0f, 0.0f);
glVertex3f(5.0f, 5.0f, 0.0f);
glVertex3f(-5.0f, 5.0f, 0.0f);
glEnd();
glPopMatrix();

glPushMatrix();


glColor3f(1.0f, 0.0f, 0.0f);
glTranslatef(x, y, -20.0f);

glBegin(GL_POINTS);
glVertex3f(-5, -5, 10.0f);
glEnd();

GLUquadricObj *qobj = gluNewQuadric();
gluQuadricDrawStyle(qobj, GLU_FILL);
gluSphere(qobj, 1.0f, 20, 20);
gluDeleteQuadric(qobj);
glPopMatrix();

最佳答案

Also what are the differences between the different coordinate spaces e.g. world, object etc.



这主要是一个惯例问题,但是:
  • 模型空间(=局部空间)是特定模型相对于其“中心”的坐标空间。如果您有一个带有模型的文件,则坐标将围绕该文件的某个点居中(例如,它的几何中心,它的底面,实际上是任何东西)。
  • 场景空间(=世界空间)是相对于场景的任意点的坐标空间
  • 眼睛空间(= View 空间)是相机在(0,0,0)点上的空间,x面朝右,y面朝上,z面在屏幕的外(-z =更深)
  • 剪辑空间(-1,-1,*)是视口(viewport)的左下角,(1,1,*)是视口(viewport)的右上角,(-1,1)中的Z坐标仅表示深度(再次较小的Z =更深)。 (片段
  • 屏幕空间(=窗口坐标)与上面的相同,除了坐标从-1..1重新缩放为与当前视口(viewport)范围和深度范围匹配的基于像素的值。

  • 通过将 模型矩阵(包含有关模型在场景中的位置的信息)相乘(在OpenGL中通常为左乘),将坐标从模型空间转换为场景空间。如果您具有场景层次结构,则对象可以有很多“堆叠”模型矩阵(剑相对于 ARM 的位置,剑柄相对于骑士的位置,骑士相对于场景的位置)。

    然后,通过乘以 View 矩阵(通常连接到“相机”对象),将坐标转换为眼睛空间。

    之后,使用 投影矩阵将这些坐标转换到屏幕空间,以便OpenGL将这些坐标映射到实际的屏幕像素(取决于视口(viewport)设置)。

    一些事实:
  • 模型和 View 矩阵通常包含平移,旋转和/或缩放,而投影矩阵通常包含透视变换,这使距离屏幕更远的对象显得更小。
  • 旧的OpenGL(2.x和更早版本)要求您将矩阵放在两个“矩阵堆栈”上:
  • GL_MODELVIEW堆栈,其中应包含View * Model(或View * Model1 * Model2 ... * ModelN),
  • GL_PROJECTION堆栈仅包含Projection矩阵。

  • 这些也可能是单个矩阵,而不是堆栈,但是引入了堆栈(以及 glPushMatrixglPopMatrix)来使程序员轻松地“保存和加载”它们。计算中仅使用每个堆栈中的“最顶层”矩阵。

    投影矩阵通常是使用 gluPerspective或等效语言创建的。 View 矩阵可以使用 gluLookAt(或类似于模型矩阵)制成,并且可以使用 glTranslateglRotateglScale轻松组装模型矩阵。

    (注意:OpenGL 3.1+删除了这些功能,使您可以使用任何矩阵和喜欢的约定)

    知道:

    I want to be able to get the coordinates of an object (e.g. triangle) after it's been translated and rotated, the reason i want to do this is so that later i can do collision detection and calculate the distance between objects using the coordinates



    计算所有物理量的合理方法是在 场景空间中进行计算。

    因此,如果您有一个模型(例如三角形网格),要获取其任何顶点在 场景空间中的位置,则只需将其与模型的 模型矩阵左乘(或在层次结构中,所有模型矩阵)。

    关于 gluProject,如果您想知道的话,这是一种便捷的方法,它允许您将一组坐标乘以当前的 PROJECTION*MODELVIEW并执行视口(viewport)转换以查看它在屏幕空间中的结束位置,然后 gluUnProject进行相反的操作。

    引用: http://www.opengl.org/resources/faq/technical/transformations.htm

    关于opengl - 如何在OpenGL中获取对象的坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8258908/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com