正交投影:
在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