2.坐标系
- 2D坐标系:一般以屏幕左上角或者左下角为原点。 3D坐标系:左手系(默认使用的)和右手系,Y UP和Z UP。
3.向量
- 向量的特性:只能位移,不能缩放、旋转。
- 两个不相等的向量确定也给平行四边形、确定一个平面、确定一个三角形等。
- 可以用单位向量控制玩家的速度。
now.Normalize(); 规范化向量,求这个向量的单位向量.- 向量叉积:u x v可以计算平面的法向量。
- 向量点积:可以用来编写shader来模拟光照的颜色效果。
4.矩阵
- 对于一个空间点,设T为平移矩阵,S为缩放矩阵,R为旋转矩阵,则V * R * S * T为变化后的位置,但这样计算效率低,可以通过先计算RTS,然后再直接V * RTS,RTS就是代表了旋转、平移、缩放的矩阵。
平面及射线
- 射线的定义:P0为起点,u为单位向量,则P(t)=P0+tu;t为射线长度
- 平面的定义:P0为平面上的一点,n为法向量,p为平面任意一点,则n(p - p0)=0
- 射线与平面关系:t = (n.p1 - n.p0) / n.u;若t>=0,则射线与平面相交,且交点为p0+tu,若t<0,则不相交。
Vector3D类
public class Vector3D
{
public float x, y, z;
public Vector3D(float x=0f,float y=0f,float z=0f)
{
this.x = x;
this.y = y;
this.z = z;
}
public Vector3D add(Vector3D vec)
{
Vector3D ret = new Vector3D(x, y, z);
ret.x += ret.x;
ret.y += ret.y;
ret.z += ret.z;
return ret;
}
public Vector3D sub(Vector3D vec)
{
Vector3D ret = new Vector3D(x, y, z);
ret.x -= vec.x;
ret.y -= vec.y;
ret.z -= vec.z;
return ret;
}
public Vector3D corss(Vector3D vec)
{
Vector3D ret = new Vector3D();
ret.x = y * vec.z - z * vec.y;
ret.y = z * vec.x - x * vec.z;
ret.z = x * vec.y - y * vec.x;
return ret;
}
public void normalize()
{
float length = (float)System.Math.Sqrt(x * x + y * y + z * z);
x /= length;
y /= length;
z /= length;
}
public override string ToString()
{
return string.Format("(" + x + "," + y + "," + z + ")");
}
public static Vector3D operator + (Vector3D lv,Vector3D rv)
{
return lv.add(rv);
}
public static Vector3D operator - (Vector3D lv,Vector3D rv)
{
return lv.sub(rv);
}
}
|