如何在 C++ 中使用 OpenGL 绘制 3D 超椭圆
How to draw a 3D super-ellipse with OpenGL in c++
为了在 C++ 中使用 OpenGL 创建 3D 球体,我使用了这个函数:
glutWireSphere(GLdouble radius, GLint slices, GLint stacks);
我的代码运行得很好,显示了一个旋转的线球。
但是我不知道如何编写绘制超椭圆的函数。
我知道超椭圆的公式:
如何使用此公式绘制 3D 超椭圆?
对于 s1=s2=1
你仍然可以使用 glutWireSphere
。应用变换矩阵,使 (1,0,0)
变换为 (rx,0,0)
,(0,1,0)
变换为 (0,ry,0)
,(0,0,1)
变换为 (0,0,rz)
。然后简单地用 glutWireSphere(1, ..., ...) 绘制身份球体。我认为 glScalef(rx,ry,rz)
会成功。
对于一般情况,您需要使用 glBegin/glEnd 或 glDrawArrays 自己生成几何图形。查看 this question 以获取一些线索。
您需要更改的一件事:
When you're done, normalize all of the vertices to smooth out the surface.
If you don't do this, you'll just get a higher-res icosahedron instead of a sphere.
不是标准化,而是将 (x,y,z)
转换为 (phi, theta, R)
,然后通过将 phi
和 theta
代入您的方程式来计算新的 (x',y',z')
。在进行任何细分之前,您也应该对初始二十面体执行此步骤
为了在 C++ 中使用 OpenGL 创建 3D 球体,我使用了这个函数:
glutWireSphere(GLdouble radius, GLint slices, GLint stacks);
我的代码运行得很好,显示了一个旋转的线球。
但是我不知道如何编写绘制超椭圆的函数。
我知道超椭圆的公式:
如何使用此公式绘制 3D 超椭圆?
对于 s1=s2=1
你仍然可以使用 glutWireSphere
。应用变换矩阵,使 (1,0,0)
变换为 (rx,0,0)
,(0,1,0)
变换为 (0,ry,0)
,(0,0,1)
变换为 (0,0,rz)
。然后简单地用 glutWireSphere(1, ..., ...) 绘制身份球体。我认为 glScalef(rx,ry,rz)
会成功。
对于一般情况,您需要使用 glBegin/glEnd 或 glDrawArrays 自己生成几何图形。查看 this question 以获取一些线索。
您需要更改的一件事:
When you're done, normalize all of the vertices to smooth out the surface. If you don't do this, you'll just get a higher-res icosahedron instead of a sphere.
不是标准化,而是将 (x,y,z)
转换为 (phi, theta, R)
,然后通过将 phi
和 theta
代入您的方程式来计算新的 (x',y',z')
。在进行任何细分之前,您也应该对初始二十面体执行此步骤