opengl旋转曲面画立体图

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opengl旋转曲面画立体图相关的知识,希望对你有一定的参考价值。

请问opengl用什么函数或方法可以使已知平面旋转得到一个立体图,比如让矩形旋转得到圆柱或圆环等;当然实际旋转的可能不是规则的矩形

opengl旋转的概念不是你这样的概念。

opengl旋转一样立体物体,这个物体只是变位置,变方向,不是变形状。
例如,转一个立体头像,开始,脸对着你,然后转动,左耳对着你,再转,后脑勺对着你,再转,右耳对着你。
例如,一架飞机,起伏升降翻腾飞行。

opengl画3维物体,需要有这个物体的外表面上的离散点,这些点组成微小的三角形或四边形或多边型。每个点的起始坐标是 xi,yi,zi;

你的矩形旋转得到圆柱或圆环等,其实是简单的圆柱或圆环面上的点的3维座标计算。例如,矩形 a*b 绕b边转:
x[i]=a*cos(w*t);y[i]=a*sin(w*t);z1[i]=b/2;z2[i]= -b/2;
w*t 离散为每5度一点,共转360度。你就得到了所有座标。圆柱面用画4边型的方法,做循环,上下两个圆用画3角形的方法做循环。

整个柱体要想在空间里抛上抛下,那就用与飞机,起伏升降翻腾飞行类似方法,调translate,rotate这种opengl函数变换。
参考技术A 期待OPENGL以后会增加LZ说的功能,目前还没有,你想画圆柱,就必须自己定点来画 参考技术B 现有的方法就是自己写个revolve 类, 计算旋转后各个面上的四边形/三角型vertex 的坐标

opengl绘图,画一个旋转的四边形和一个旋转的三角形,平滑着色和单一着色

opengl单一着色和平滑着色,以及图形的旋转

 
package com.example.zp.myapplication;
 
import java.nio.FloatBuffer;
 
 
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
 
import android.opengl.GLSurfaceView.Renderer;
 
public class GLRender2 implements Renderer
{
// int one =0x10000;
// //三角形三个顶点
// private IntBuffer triggerBuffer = BufferUtil.intToBuffer(new int[]{
// 0,one,0, //上顶点
// -one,-one,0, //左下点
// one,-one,0,}); //右下点
// //正方形的4个顶点
// private IntBuffer quaterBuffer = BufferUtil.intToBuffer(new int[]{
// one,one,0,
// -one,one,0,
// one,-one,0,
// -one,-one,0});
 
float rotateSpeed =5* (float) Math.PI/18;
float rotateTri = 0;
float one = 1f;
//三角形三个顶点
private FloatBuffer triggerBuffer2 = BufferUtil.floatToBuffer(new float []{
0,one,0, //上顶点
-one,-one,0, //左下点
one,-one,0,}); //右下点
//正方形的4个顶点
private FloatBuffer quaterBuffer2 = BufferUtil.floatToBuffer(new float[]{
one,one,0,
-one,one,0,
one,-one,0,
-one,-one,0});
private FloatBuffer colorBuffer2 = BufferUtil.floatToBuffer(new float[]{
one,0,0,one,
0,one,0,one,
0,0,one,one,
});
 
@Override
public void onDrawFrame(GL10 gl)
{
// 清除屏幕和深度缓存
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
// 允许设置顶点
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
 
//**********************绘制三角形***********************************//
// 重置当前的模型观察矩阵
gl.glLoadIdentity();
// 移动绘图原点的坐标与上面的语句连用就相当于设置新的绘图远点坐标,gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);后面的1-10是指图像的1-10层,
// 图像所处层次越大,在屏幕上显示就越小。默认为(0,0,1),
// 左移 1.5 单位,并移入屏幕 6.0。
gl.glTranslatef(-1.5f, 0.0f, -6.0f);
 
gl.glRotatef(rotateTri, 0.0f, 1.0f, 0.0f);
//启用平滑着色
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);// gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);可以直接设置绘图的单调颜色
// 设置三角形点
// gl.glVertexPointer(3, GL10.GL_FIXED, 0, triggerBuffer);
gl.glVertexPointer(3,GL10.GL_FLOAT,0,triggerBuffer2);
//设置平滑着色的颜色矩阵
gl.glColorPointer(4,GL10.GL_FLOAT,0,colorBuffer2);//都是一维矩阵,因此第一个参数就是表示一个颜色的长度表示
//绘制
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, 3);
// 关闭颜色平滑着色设置
gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
gl.glFinish();
//****************************绘制四边形***********************************//
// 重置当前的模型观察矩阵
gl.glLoadIdentity();
//右移 1.5 单位,并移入屏幕 6.0
gl.glTranslatef(1.5f, 0.0f, -6.0f);
//旋转矩阵
gl.glRotatef(rotateTri, 0.0f, 0.0f, 1.0f);
//设置和绘制正方形
// gl.glVertexPointer(3, GL10.GL_FIXED, 0, quaterBuffer);
gl.glVertexPointer(3,GL10.GL_FLOAT,0,quaterBuffer2);
//单一着色
gl.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
gl.glFinish();
 
// 关闭顶点设置
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
 
rotateTri=rotateTri+rotateSpeed;
}
 
@Override
public void onSurfaceChanged(GL10 gl, int width, int height)
{
float ratio = (float) width / height;
//设置OpenGL场景的大小
gl.glViewport(0, 0, width, height);
//设置投影矩阵
gl.glMatrixMode(GL10.GL_PROJECTION);
//重置投影矩阵
gl.glLoadIdentity();
// 设置视口的大小
gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);
// 选择模型观察矩阵
gl.glMatrixMode(GL10.GL_MODELVIEW);
// 重置模型观察矩阵
gl.glLoadIdentity();
 
}
 
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config)
{
// 启用阴影平滑
gl.glShadeModel(GL10.GL_SMOOTH);
 
// 黑色背景
gl.glClearColor(0, 0, 0, 0);
 
// 设置深度缓存
gl.glClearDepthf(1.0f);
// 启用深度测试
gl.glEnable(GL10.GL_DEPTH_TEST);
// 所作深度测试的类型
gl.glDepthFunc(GL10.GL_LEQUAL);
 
// 告诉系统对透视进行修正
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
}
 
}
实现的效果:

以上是关于opengl旋转曲面画立体图的主要内容,如果未能解决你的问题,请参考以下文章

opengl绘图,画一个旋转的四边形和一个旋转的三角形,平滑着色和单一着色

[opengl] 画一个可移动的自行车 二维几何变换(平移旋转缩放)

QT5 OpenGL (六, 键盘事件, 开关灯,放大缩小综合运用)

OpenGL 2D旋转问题

如何在OpenGL中计算三角形网格的顶点法线?

Android opengl 画文字,怎么把文字后面的黑色背景去掉