如何在opengl的3d空间中旋转单个形状?

Posted

技术标签:

【中文标题】如何在opengl的3d空间中旋转单个形状?【英文标题】:How to rotate a single shape in 3d space in opengl? 【发布时间】:2013-11-08 17:05:33 【问题描述】:

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

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

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】:

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

对于每个对象:

pushMatrix()

绘制对象

popMatrix()

在模型视图矩阵中...

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

【讨论】:

以上是关于如何在opengl的3d空间中旋转单个形状?的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 3D 空间中旋转 2D 形状时出现问题

在 OpenGL 中移动 3d 形状

c++:如何使用 sdl 将位图加载到 opengl 中的多维数据集中?

如何在three.js的3空间中绘制扁平形状?

使用 C++ 在 OpenGL 中使用键盘移动 3d 形状

如何在 3D 空间中旋转矢量? P5.js