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

时间:2013-11-08 17:05:33

标签: java opengl rotation shapes

所以我对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 个答案:

答案 0 :(得分:0)

如果为每个需要独立移动的对象提供模型视图矩阵,则可以实现此目的。快速绘制/移动一些独立对象的另一个选项是:

每个对象

pushMatrix()

绘制对象

popMatrix()

在模型视图矩阵中...

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