opengles绘制天空穹

天空穹技术中不再使用立方体模拟天空,而是用一个半球面模拟天空,此半球面上贴上对应的天空纹理,摄像机位于天空穹内部。

效果图




核心代码 半球的绘制

package test.com.opengles11_6;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.util.ArrayList;
import android.opengl.GLES20;
/**
 * Created by hbin on 2016/10/18.
 */
public class Sky {
    final float UNIT_SIZE=100.0f;
    //自定义渲染程序的引用
    int mProgram;
    //总变换矩阵的引用
    int muMVPMatrixHandle;
    //顶点属性的引用
    int maPositionHandle;
    //顶点纹理坐标属性的引用
    int maTexCoorHandle;
    //顶点数据缓冲以及顶点纹理坐标数据缓冲
    FloatBuffer mVertexBuffer;
    FloatBuffer mTexCoorBuffer;
    //顶点数量
    int vCount=0;

    public Sky(MySurfaceView mv)
    {
        initVertexData(UNIT_SIZE);
        initShader(mv);
    }
    //初始化顶点数据的方法
    public void initVertexData(float radius)
    {
        float ANGLE_SPAN=18f;
        float angleV=90;
        ArrayList<Float> alVertix=new ArrayList<Float>();//存放顶点坐标的ArrayList

        for(float vAngle=angleV;vAngle>0;vAngle=vAngle-ANGLE_SPAN)//垂直方向angleSpan度一份
        {
            for(float hAngle=360;hAngle>0;hAngle=hAngle-ANGLE_SPAN)//水平方向angleSpan度一份
            {
                //纵向横向各到一个角度后计算对应的此点在球面上的四边形顶点坐标
                //并构建两个组成四边形的三角形
                double xozLength=radius*Math.cos(Math.toRadians(vAngle));
                float x1=(float)(xozLength*Math.cos(Math.toRadians(hAngle)));
                float z1=(float)(xozLength*Math.sin(Math.toRadians(hAngle)));
                float y1=(float)(radius*Math.sin(Math.toRadians(vAngle)));

                xozLength=radius*Math.cos(Math.toRadians(vAngle-ANGLE_SPAN));
                float x2=(float)(xozLength*Math.cos(Math.toRadians(hAngle)));
                float z2=(float)(xozLength*Math.sin(Math.toRadians(hAngle)));
                float y2=(float)(radius*Math.sin(Math.toRadians(vAngle-ANGLE_SPAN)));

                xozLength=radius*Math.cos(Math.toRadians(vAngle-ANGLE_SPAN));
                float x3=(float)(xozLength*Math.cos(Math.toRadians(hAngle-ANGLE_SPAN)));
                float z3=(float)(xozLength*Math.sin(Math.toRadians(hAngle-ANGLE_SPAN)));
                float y3=(float)(radius*Math.sin(Math.toRadians(vAngle-ANGLE_SPAN)));

                xozLength=radius*Math.cos(Math.toRadians(vAngle));
                float x4=(float)(xozLength*Math.cos(Math.toRadians(hAngle-ANGLE_SPAN)));
                float z4=(float)(xozLength*Math.sin(Math.toRadians(hAngle-ANGLE_SPAN)));
                float y4=(float)(radius*Math.sin(Math.toRadians(vAngle)));

                //构建第一三角形
                alVertix
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值