android 用OPENGL ES 实现投影效果(正交投影与透视投影)

    

            正交投影:

         在OPENGL ES中只支持正交投影与透视投影,正交投影是平行投影的一种,特点是和观察者的视线是平行的,不会产生真               实世界中远大近小的的透视效果。在此做个假设:

         I与Z是一个分别具有二阶矩的 n维和m唯的随机向量。如果存在一个与I同纬的随机向量“X;”,如果满足下列三个条件则将“X;”称             为 是 I在Z上的正交投影。

             (1)线性表示,“X;”=A+BZ;

             (2)无偏性,E(“X;”)=E(I);

             (3)I-&“X;”与Z正交,即E[(I-Icirc;)ZT]=0;


         透视投影:

           透视投影属于非平行投影,特点是观察这的实现在远处是相交的,当视线相交时表示灭点。因为通过透视投影可以产生现实               世界中近大远小的效果,所以使用透视投影可以得到一个更加真实的3D感受,所以现实游戏中一般采用透视投影效果。


         两种投影的区别:

         在正交投影中,图形沿平行线变换到投影面上。对透视投影来说,图形沿收敛于某一点的直线变换到投影面上,这个点被称为           投影中心,相当与观察点,也被称为视点。

         正交投影与透视投影的区别在与透视投影的投影中心到投影面之间的距离是有限的,二正交投影的投影中心到投影面的之间的           距离是无限的。当投影中心在无限远时,投影线相互平行,所以定义正交投影时,给出投影线的方向就可以了,而定义透视             投影时,需要制定投影中心的具体位置。

            正交投影保持物体的有关比例不变,这是三维绘图中产生比例图画的方法,物体的各个面的精确试图可以由平行投影得到。             另一方面,虽然透视投影不会保持相关比例,但是能够生成真实感的视图。对同样大小的物体来说,离投影面较远的物体                 比离投影面较近的物体的投影图像要小,会产生远大近小的梦幻效果。



        1.MyActiyity.java

       package com.scout.eeeeeee;

        import android.app.Activity;
        import android.os.Bundle;
        import android.widget.CompoundButton;
        import android.widget.CompoundButton.OnCheckedChangeListener;
        import android.widget.LinearLayout;
        import android.widget.ToggleButton;

    public class MyActivity extends Activity {
    private MySurfaceView mSurfaceView;                 //声明MySurfaceView对象
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);            //设置布局
        mSurfaceView = new MySurfaceView(this);        //创建
        mSurfaceView.requestFocus();                   //获取焦点  //MySurfaceView对象
        mSurfaceView.setFocusableInTouchMode(true);//设置为可触控
        LinearLayout ll = (LinearLayout) findViewById(R.id.main_liner); //获得布局引用
        ll.addView(mSurfaceView);                    //在布局中添加MySurfaceView对象
        //控制是否打开背面剪裁的ToggleButton
        ToggleButton tb = (ToggleButton) this.findViewById(R.id.ToggleButton01);//获得按钮引用
        tb.setOnCheckedChangeListener(new MyListener()); //为按钮设置监听器
     }

     class MyListener implements OnCheckedChangeListener {
        @Override
        public void onCheckedChanged(CompoundButton buttonView,
                                     boolean isChecked) {
            // TODO Auto-generated method stub
            mSurfaceView.isPerspective = !mSurfaceView.isPerspective;//在正交投影与透视投影之间切换
            mSurfaceView.requestRender();//重新绘制
        }
     }

     @Override
     protected void onResume() {
        super.onResume();
        mSurfaceView.onResume();
     }

     @Override
     protected void onPause() {
        super.onPause();
        mSurfaceView.onPause();
     }
      }



         2.MySufaceView.java

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值