3

鉴于不推荐使用最新 OpenGL 中的旋转,我如何旋转三角形?弃用前:

    gl.glRotated(i, 0, 0, 1);

    gl.glBegin(GL2.GL_TRIANGLES);       
    gl.glVertex3f(0.0f, 1.0f, 0.0f );   
    gl.glVertex3f(-1.0f, -1.0f, 0.0f ); 
    gl.glVertex3f(1.0f, -1.0f, 0.0f );  
    gl.glEnd();

我试过这样做,但它只是一个翻译:

    double rotCos = Math.cos(i);
    double rotSine = Math.sin(i);


    gl.glBegin(GL2.GL_TRIANGLES);       
    gl.glVertex3d(0.0f + rotSine, 1.0f + rotCos, 0.0f );    
    gl.glVertex3d(-1.0f + rotSine, -1.0f + rotCos, 0.0f );  
    gl.glVertex3d(1.0f + rotSine, -1.0f + rotCos, 0.0f );   
    gl.glEnd();

如何实现 glRotated 背后的数学运算?

4

3 回答 3

4

您所做的并不是弃用这些功能背后的想法;这个弃用还包括函数glBeginglVertexglEnd,所以如果你使用它们,你就错过了重点

你应该实现一个顶点着色器,在其中你执行顶点变换的通常步骤,即先将顶点与模型视图相乘,然后是投影矩阵;您还可以将模型视图和投影收缩到一个矩阵中,但这会使照明变得有些棘手。

矩阵通过所谓的uniforms传递给 OpenGL 。要创建矩阵,请使用一些向量数学库,如 GLM 或 Eigen(带有 Eigen 随附的非官方 OpenGL 模块)。

于 2012-09-20T15:30:07.757 回答
1

如何实现 glRotated 背后的数学运算?

矩阵glRotate()结构就在文档中

于 2012-09-20T16:07:05.583 回答
0

使用折旧的函数仍然可以,但如果你想使用“现代”OpenGL(OpenGL 3 和更高版本),你将不得不做一些不同的事情。

一方面,您不再使用glBegin/glEnd而是使用顶点缓冲区对象绘制所有内容。其次,固定功能管道已被移除,因此需要顶点和片段着色器来绘制任何内容。还有许多其他更改(包括添加顶点数组对象和几何着色器)。

在 OpenGL 3 中进行旋转的方法是在制服中传递模型视图和投影矩阵,并使用它们来计算顶点着色器中的顶点位置。

归根结底,如果你想学习“现代” OpenGL,你最好只在网上寻找关于 OpenGL 3.0(或更高版本)的教程。

于 2012-09-20T22:04:26.623 回答