当前位置: 首页 > 知识库问答 >
问题:

如何在opengl中旋转三维空间中的单个形状?

融渊
2023-03-14

所以我对opengl和创建3d形状非常陌生。对于我的例子,我有两个正方形,一个是高度/宽度2,中心在原点坐标(0,0,-10),另一个在窗口的最左侧。我试图沿着x-z平面旋转位于原点的正方形,而不旋转位于屏幕最左侧的正方形。我的方法是将中心正方形的每个xyz坐标保存为一个变量,并创建一个使用cos(θ)行为沿着x-z平面旋转正方形的方法。我的代码工作,但我认为这是一个可怕的方法,因为一定有一些更有效的方法已经创建,可以做同样的功能。我看了glRotatef(),但根据我的理解,这只会旋转我的相机视图,最终会旋转中间的正方形和最左边的正方形,而我只想旋转中间的正方形。是否还有其他方法可以在三维空间中轻松旋转单个二维形状?

如果相关的话,我已经包括了我自己为中间正方形做的旋转代码:(顺便说一句,蓝色类只是我做的一些类,它有正方形坐标和cos(θ)的圆度)

if (Keyboard.isKeyDown(Keyboard.KEY_LEFT)) {

            blue.setCircle(blue.getCircle()+1f);//getCircle is initially zero and gets incremented by 1 for everytime the program loops with the user holding the left button.

            blue.setXfrontTR((float)Math.cos(Math.toRadians(blue.getCircle())));//Changing top-right x coordinate of the middle square
            blue.setZfrontTR(-10f+ ((float)Math.cos(Math.toRadians(blue.getCircle()+270f)))); //Changing top-right z coordinate of the middle square.

            blue.setXfrontTL((float)Math.cos(Math.toRadians(blue.getCircle()+180f)));
            blue.setZfrontTL(-10f+ ((float)Math.cos(Math.toRadians(blue.getCircle()+90f))));//Changing top-left x,z coordinates

            blue.setXfrontBL((float)Math.cos(Math.toRadians(blue.getCircle()+180f)));
            blue.setZfrontBL(-10f+ ((float)Math.cos(Math.toRadians(blue.getCircle()+90f))));//Changing bottom-left x,z coordinates

            blue.setXfrontBR((float)Math.cos(Math.toRadians(blue.getCircle())));
            blue.setZfrontBR(-10f+ ((float)Math.cos(Math.toRadians(blue.getCircle()+270f))));//Changing bottom-right x-z coordinates
}

共有1个答案

子车修平
2023-03-14

如果你给每个需要独立移动的对象一个模型视图矩阵,你可以实现这一点。另一个快速绘制/移动几个独立对象的选项是:

对于每个对象:

pushMatrix()

绘图对象

popMatrix()

而在modelview矩阵中。。。

绘图的方法很大程度上取决于你编码的OpenGL版本,但是上面的方法适用于简单的绘图。我不是OpenGL/3D编程的专家,所以,如果你等一会儿,你可能会听到(看到)比我提供的更好的智慧:)

 类似资料:
  • 现在,我们可以在3D空间中绘制2D三角形了,让我们使用WebGL包装器对象的动画方法,试着让它绕y轴旋转起来。 图9-2 旋转三角形平面 操作步骤 按照以下步骤使用WebGL让三角形绕y轴旋转: 链接到glMatrix库和WebGL包装器: <script type="text/javascript" src="glMatrix-1.0.1.min.js"> </script> <script

  • 问题内容: 我已经在中绘制了一些图形,例如圆形,矩形等。 但是我想绘制一些旋转了特定程度的图形,例如旋转的椭圆。我该怎么办? 问题答案: 如果您使用plain ,则强制转换为first: 旋转整个: 要重置旋转(因此您只旋转一件事): 例:

  • 我正在使用GLFW在c中创建一个OpenGL应用程序。基于本教程,我成功地创建了类似FPS的摄影机(WASD移动-鼠标移动-俯仰-偏航)。 我使用的相机鼠标移动 这很好,但问题是我的应用程序窗口不是全屏的,所以如果我想旋转鼠标光标,它就会离开窗口,很难控制相机。 是否可以做与glfwSetCursorPosCallback相同的事情,但仅当按下左键时?我希望相机做与现在相同的事情,但仅当我按下左键

  • 我使用的是OpenGL,但我并不完全满意将每个三角形(或在我的例子中为四边形)的值传递给片段着色器的标准方法,即将它们分配给基本体的每个顶点,并将它们传递给顶点着色器,以推测不必要的插值(除非使用“flat”指令)在片段着色器中(也就是说,每个片段不变化)。 是否有某种方法可以存储每个三角形(或四边形)的值,这些三角形(或四边形)需要在片段着色器中访问,这样就不需要每个顶点的冗余副本?那么,这种方

  • 我知道如果我首先对多边形进行三角剖分,那么我就可以轻松可靠地检查任何三角形的面······但问题是我的三角剖分库要求知道平面正常。所以,先有蛋后有鸡。 我如何在一个非凸多边形中选择两条边(或三个顶点)来可靠地定义多边形的朝向?

  • 我们当前的任务要求我们在openGL中使用较旧的固定管道方法。我们使用的是LWJGL 2.9.3。下面的代码显示一个三角形。问题是,它会疯狂地闪烁。显示器。swapBuffers()方法不会引发异常,并且无论是否包含它都没有任何区别。我根据这个问题创建了这个示例: gluPerspective、GluViewport、gluLookAt以及GL_投影和GL_MODELVIEW矩阵 编辑 还有一件事