0%

裁剪

直线段的裁剪

Cohen-Sutherland裁剪

中点分割裁剪算法

梁友栋-Barskey算法

多边形裁剪

字符裁剪

阅读全文 »

线段相交

方程式


1.如果

则线段平行
2.

求出u,v的值,
如果 0<=u<=1,0<=v<=1,则线段相交,否则不相交
3.根据 u或者v 可以求的交点


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
bool IsLineIntersected( lt::Vector2<float> a1, lt::Vector2<float> b1, lt::Vector2<float> a2, lt::Vector2<float> b2) {
lt::Vector2<float> a1b1 = b1 - a1;
lt::Vector2<float> a2b2 = b2 - a2;
lt::Vector2<float> a2a1 = a1 - a2;
lt::Vector2<float> a1a2 = a2 - a1;
if (a1b1.x * a2b2.y - a2b2.x * a1b1.y == 0) { return false; }
float u = (a2b2.x * a2a1.y - a2a1.x * a2b2.y) / (a1b1.x * a2b2.y - a2b2.x * a1b1.y);
float v = (a1b1.x * a1a2.y - a1a2.x * a1b1.y) / (a2b2.x * a1b1.y - a1b1.x * a2b2.y);
return u >= 0 && u <= 1 && v >= 0 && v<=1;
}

lt::Vector2<float> PointLineIntersected(lt::Vector2<float> a1, lt::Vector2<float> b1, lt::Vector2<float> a2, lt::Vector2<float> b2) {
lt::Vector2<float> a1b1 = b1 - a1;
lt::Vector2<float> a2b2 = b2 - a2;
lt::Vector2<float> a2a1 = a1 - a2;
lt::Vector2<float> a1a2 = a2 - a1;
float u = (a2b2.x * a2a1.y - a2a1.x * a2b2.y) / (a1b1.x * a2b2.y - a2b2.x * a1b1.y);
return a1 + a1b1 * u;
}
阅读全文 »

空间变换

空间变换和矩阵变换

根据变换操作求变换矩阵

本地坐标系和世界坐标系的相互变换(本地空间和世界空间)

  • 已知世界坐标点和变换操作,计算变换矩阵,求本地坐标点
  • 已知本地坐标点和变换操作,计算变换矩阵,求世界坐标点
  • 已知世界坐标系和本地坐标系,计算变换矩阵

视图变换(摄像机坐标系)

投影变换

正交投影

透视投影

阅读全文 »

绕任意点旋转

以点$C(c_x,c_y,c_z)$为原点,旋转$\theta(\alpha,\beta,\gamma)$

  • 1.先将整个模型平移,点C平移到原点;
  • 2.然后旋转$\theta$;
  • 3.最后将整个模型平移,原点平移到点C原来的位置;

矩阵

阅读全文 »

Transformation

旋转

缩放

齐次坐标

平移

模型变换Modeling

视图变换View

Camera Position
Camera LookAt
Camera UpDirection

投影变换Projection

Orthographic Projection

阅读全文 »