delphi - OpenGL:如何将 2D 形状车床成 3D?

标签 delphi opengl

我有一个 OpenGL 程序(用 Delphi 编写),可以让用户绘制多边形。我想自动绕轴(例如 Y asix)旋转(车床)并获得 3D 形状。

我该怎么做?

最佳答案

为了简单起见,您可以强制至少有一个点位于旋转轴上。您可以通过向多边形中的点的所有 x 值添加/减去相同的值以及向所有 y 值添加/减去相同的值来轻松完成此操作。它将保留原来的形状。

剩下的并不是那么难。选择一个相当小的角度,比如一度或两度,并计算出多边形绕轴旋转时顶点的坐标。然后用三角扇和三角条将这些点连接起来。

绕轴旋转点只是基本的毕达哥拉斯原理。在 0 度旋转时,点的二维坐标在第三维中的值为 0。

假设这些点位于 X 和 Y 中,并且我们围绕 Y 旋转。原始的“X”坐标表示斜边。旋转 1 度时,我们有:

sin(1) = z/hypotenuse
cos(1) = x/hypotenuse

(假设基于度数的三角函数)

将点 (x, y) 绕 Y 轴旋转角度 T 以生成 3d 点 (x', y', z'):

y' = y
x' = x * cos(T)
z' = x * sin(T)

因此,对于多边形边缘上的每个点,您都会生成一个以旋转轴为中心的 360 个点的圆。

现在制作一个 3D 形状,如下所示:

  1. 使用中心点和第一个旋转点数组创建 GL“三角扇”
  2. 对于每个连续的数组,使用数组中的点和前一个数组中的点创建一个三角形带
  3. 通过创建另一个以中心点为中心的三角形扇形并使用最后一个数组中的点来完成

需要注意的一件事是,通常我使用的三角函数以弧度为单位测量角度,而 OpenGL 使用度数。要将角度转换为弧度,公式为:

degrees = radians / pi * 180

关于delphi - OpenGL:如何将 2D 形状车床成 3D?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4117084/

相关文章:

forms - 在主窗体之前创建辅助窗体,同时保持 FormMain 作为主窗体?

delphi - 通过进程ID获取窗口句柄

c++ - C++结构到Delphi Record dll调用

delphi - Delphi 的语言补充

c - 如何在 GLFW 中启用帧缓冲区透明度?

VBO 中普通数据的 OpenGL 排列

java.lang.NoSuchMethodError : javax. media.opengl.GLDrawableFactory.initSingleton()V

opengl - 高级摩尔纹,HLSL/GLSL 程序纹理着色器中的图案减少 - 抗锯齿

delphi - GetWindowRect 检测 bsSingle BoarderStyle

c++ - OpenGL 3.3/GLSL 和 C++ 错误 : "must write to gl_Position"