【问题标题】:How to create a wiresphere in openGL without glutWireSphere()?如何在没有 glutWireSphere() 的情况下在 openGL 中创建一个wiresphere?
【发布时间】:2015-05-01 16:09:37
【问题描述】:

我正在尝试找到一种使用 LWJGL(轻量级 Java 游戏库)绘制线球的方法,LWJGL 是从 openGL 派生的。我已经看到使用 GLUT 我可以使用函数glutWireSphere(double, int, int),但是 LWJGL 呢?有没有类似的方法?并非所有人都想使用 GLUT。我一直在寻找,但我还没有找到任何东西。提前致谢。

【问题讨论】:

  • LWJGL 不包括绘制/构建复杂模型的方法。您别无选择,只能自己构建模型,或者从 3D 模型编辑器加载它。如果您不想自己进行数学运算,您也可以使用外部库来执行此操作。至于制作线框,调用glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); 后渲染一个普通模型即可。
  • 您可以相对容易地构造球体,只需 2 个 fors 使用球面到笛卡尔坐标转换,或者如果您想要更好的视觉质量,可以使用 Sphere triangulation via subdivision

标签: opengl graphics 3d lwjgl


【解决方案1】:

嗯,正如文森特所说,似乎没有办法像 glut 那样简单。但是我们可以用更多的代码来做到这一点。 Spektre 在他的评论中贡献了一种方式。这是我发现的一种使用球体参数方程的方法:

public void myWireSphere(float r, int nParal, int nMerid){
    float x,y,z,i,j;
    for (j=0;j<Math.PI; j+=Math.PI/(nParal+1)){
        glBegin(GL_LINE_LOOP);
        y=(float) (r*Math.cos(j));
        for(i=0; i<2*Math.PI; i+=Math.PI/60){
            x=(float) (r*Math.cos(i)*Math.sin(j));
            z=(float) (r*Math.sin(i)*Math.sin(j));
            glVertex3f(x,y,z);
        }
        glEnd();
    }

    for(j=0; j<Math.PI; j+=Math.PI/nMerid){
        glBegin(GL_LINE_LOOP);
        for(i=0; i<2*Math.PI; i+=Math.PI/60){
            x=(float) (r*Math.sin(i)*Math.cos(j));
            y=(float) (r*Math.cos(i));
            z=(float) (r*Math.sin(j)*Math.sin(i));
            glVertex3f(x,y,z);
        }
        glEnd();
    }
}

嗯,已经足够了。如果添加 glRotatef(),您可以更好地查看此 3D 图形。例如,您可以这样运行代码(在主循环中):

float radius=50
glRotatef(30,1f,0f,0f);
myWireSphere(radius, 10, 10);

希望这对有同样问题的人有所帮助。

【讨论】:

    猜你喜欢
    • 2012-09-11
    • 1970-01-01
    • 2016-07-12
    • 2017-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    相关资源
    最近更新 更多