1. 什麼是映象變換?
在2d中映象變換就如下圖所示,沿著某條軸發生對稱現象就叫映象變換。在3d中同理可以得到沿著某個平面發生對稱的現象。2. 映象變換的矩陣是怎樣的?
我們想來看簡單的,沿著x軸、y軸或z軸發生映象變換(注意是「沿著」軸的映象,而不是「關於」軸對稱),原理很簡單,只需要讓x、y或z變為相反數即可。所以我們分別只需令單位矩陣上第一列、第二列或第三列的1變為-1,就分別得到沿著x軸、y軸或z軸發生映象變換的矩陣。3. 映象矩陣程式設計示例再來看複雜的,沿著任意軸發生映象變換,需要用到下面這個矩陣(該軸給出的方向向量一定要是單位向量)(數學證明暫時不給出,詳見《3d數學基礎 圖形與遊戲開發》)。
void matrix3x3::setreflect(e_axis axis)
case axis_y:
case axis_z:
}}void matrix3x3::setreflect(vector3 &vec)
4. 映象矩陣程式設計完整程式示例
#pragma once
#include
enum e_axis;
const
float pi = 3.14159;
#pragma once
class vector3;
//標量乘向量
vector3 operator*(float scalar, vector3& vec);
#include "vector3.h"
#include
vector3::vector3():x(0.0),y(0.0),z(0.0)
vector3::vector3(float x,float y,float z):x(x),y(y),z(z)
void vector3::zero()
vector3 vector3::operator-() const
float vector3::length() const
vector3 vector3::operator*(float scalar)
vector3& vector3::operator*=(float scalar)
vector3& vector3::operator/=(float scalar)
vector3 operator*(float scalar, vector3& vec)
vector3 vector3::operator/(float scalar)
void vector3::normal()
vector3 vector3::operator+(vector3& rhs) const
vector3& vector3::operator+=(vector3& rhs)
vector3 vector3::operator-(vector3& rhs) const
vector3& vector3::operator-=(vector3& rhs)
float vector3::distance(vector3& vec) const
float vector3::operator*(vector3& rhs) const
vector3 vector3::crossproduct(vector3& vec) const
#pragma once
#include "mathutil.h"
#include "vector3.h"
class matrix3x3
;//向量乘以矩陣
vector3 operator*(vector3& vec,matrix3x3& mat);
//向量乘等矩陣
vector3& operator*=(vector3& vec,matrix3x3& mat);
#include "matrix3x3.h"
#include
matrix3x3 matrix3x3::operator*(matrix3x3& rhs)
matrix3x3& matrix3x3::operator*=(matrix3x3& rhs)
vector3 operator*(vector3& vec,matrix3x3& mat)
vector3& operator*=(vector3& vec,matrix3x3& mat)
void matrix3x3::setrotate(e_axis axis,float theta)
case axis_y:
case axis_z:
default:
assert(false);
}}void matrix3x3::setscale(vector3& vec)
void matrix3x3::setorthproject(vector3 &vec)
void matrix3x3::setreflect(e_axis axis)
case axis_y:
case axis_z:
}}void matrix3x3::setreflect(vector3 &vec)
#include
#include "vector3.h"
#include "matrix3x3.h"
using
namespace
std;
float tozero(float num)
void print_v(vector3 v)
void print_m(matrix3x3 m)
int main()
5. **執行結果
[ 10, 20, 30 ]
[ -10, 20, 30 ]
[ 10, 20, -30 ]
3D數學 矩陣和線性變換之縮放
1.具有縮放效果的矩陣是怎樣的?我們這裡只做沿著x y z軸方向的縮放,至於沿著任意方向的縮放比較複雜而且也很少用,所以暫時不介紹。如下圖所示,原理非常簡單,x y z乘上對應的縮放係數kx,ky,kz就得到了縮放後的結果。2.縮放矩陣程式設計示例 void matrix3x3 setscale v...
3D數學 矩陣和線性變換之正交投影
1.具有正交投影效果的矩陣是怎樣的?這裡給出乙個正交投影在法向量 而且同時又是單位向量 為 x,y,z 平面上的投影矩陣,數學證明暫時不說,詳見 3d數學基礎 圖形與遊戲開發 2.投影矩陣程式設計示例 void matrix3x3 setorthproject vector3 vec 3.投影矩陣程...
數學 3D和矩陣
跟緊工作需求學習,於是抽了點時間看了看用於2d3d轉換的矩陣內容。一般來說,方陣能夠描述任意線性變換。線性變換保留了直線和平行線,但是原點沒有移動。線性變換保留直線的同時,其他的幾何性質如長度 角度 面積和體積可能在變換中發生了改變。線性變換可能 拉伸 但不會 彎折 捲摺 座標系。任意向量的一種擴寫...