変位の点で外側層に対する内側層
シーン内の三次元の特徴の実現では、座標系が回転及び並進ノードと同様の機能、発見プロセスにおいて実装さにUGを利用する必要があります
変換層は、その後、機能層の回転内に配置されている場合:回転動作前が経過した場合、翻訳、ノードは、中心を回転することなく移動、シーンに揺動が発生します。
レベルシフト層は、機能層の回転の外側に配置されている場合は、:翻訳されたときに、シーン内のノードを引き起こす回転による場合は、事前は、なく、センサの翻訳の元の方向よりも、軸変換アフリカ座標。
反射された後、次のプログラム:変換層の各内側および外側回転層の回転は、次に、内側の内層データ変換、外層、内層への変換が完了した後(座標軸変換保証)各パン内の層とは、データをリセットノード内面世界の相対位置が変化しない座標系ことを確実にするために、翻訳開始時の状態に、及び回転(揺動現象が発生しない)、次の翻訳に影響を及ぼしません。
以下は、相関アルゴリズムです。
まず、回転アルゴリズム
一つの問題:一度X、Y、Z軸回りのポイントXYZ空間
この問題は、インターネットがより要約されている、比較的簡単です。
回転が提供される前の座標、回転座標。
1. Z軸回りの角度γ
式:
X '=cosγ⋅x-sinγ⋅y
Y「=sinγ⋅x+coγ⋅y
Z '= Z
最後に、コードを表します。
//将空间点绕Z轴旋转 //输入参数 x y为空间点原始x y坐标 //thetaz为空间点绕Z轴旋转多少度,角度制范围在-180到180 //outx outy为旋转后的结果坐标 void codeRotateByZ( double x, double y, double thetaz, double & outx, double & outy) { double x1 = x; //将变量拷贝一次,保证&x == &outx这种情况下也能计算正确 double y1 = y; double rz = thetaz * CV_PI / 180; outx = cos (rz) * x1 - sin (rz) * y1; outy = sin (rz) * x1 + cos (rz) * y1; } |
Y軸角度βは約2回転
式:
X '=cosβ⋅x+sinβ⋅z
Y '= Y
Z「= - +sinβ⋅xcosβ⋅
最後に、コードを表します。
//将空间点绕Y轴旋转 //输入参数 x z为空间点原始x z坐标 //thetay为空间点绕Y轴旋转多少度,角度制范围在-180到180 //outx outz为旋转后的结果坐标 void codeRotateByY( double x, double z, double thetay, double & outx, double & outz) { double x1 = x; double z1 = z; double ry = thetay * CV_PI / 180; outx = cos (ry) * x1 + sin (ry) * z1; outz = cos (ry) * z1 - sin (ry) * x1; } |
3軸X周りの回転角α
式:
X '= X
Y「=cosα⋅y-sinα⋅z
Z「=sinα⋅y+sinα⋅z
最後に、コードを表します。
//将空间点绕X轴旋转 //输入参数 y z为空间点原始y z坐标 //thetax为空间点绕X轴旋转多少度,角度制范围在-180到180 //outy outz为旋转后的结果坐标 void codeRotateByX( double y, double z, double thetax, double & outy, double & outz) { double y1 = y; //将变量拷贝一次,保证&y == &y这种情况下也能计算正确 double z1 = z; double rx = thetax * CV_PI / 180; outy = cos (rx) * y1 - sin (rx) * z1; outz = cos (rx) * z1 + sin (rx) * y1; } |
第二の問題:回転軸の周り任意の空間のポイント
まず、「任意の軸」単位ベクトルを定義する必要があり、例えば、X軸ベクトルができ表すこと。
それは、回転軸の単位ベクトルのために仮定されている元の座標回転、回転の座標、回転角度を、そうあります。
X '=(vx⋅vx⋅(1-cosθと)+cosθと)⋅x+(vx⋅vy⋅(1-cosθと)-vz⋅sinθ)⋅y+(vx⋅vz⋅(1-cosθと)+vy⋅sinθ) ⋅z
y′=(vx⋅vy⋅(1−cosθ)+vz⋅sinθ)⋅x+(vy⋅vy⋅(1−cosθ)+cosθ)⋅y+(vy⋅vz⋅(1−cosθ)−vx⋅sinθ)⋅z
z′=(vx⋅vz⋅(1−cosθ)−vy⋅sinθ)⋅x+(vy⋅vz⋅(1−cosθ)+vx⋅sinθ)⋅y+(vz⋅vz⋅(1−cosθ)+cosθ)⋅z
计算时照着公式代入即可。
最后给出代码实现:
//定义返回结构体 struct Point3f { Point3f( double _x, double _y, double _z) { x = _x; y = _y; z = _z; } double x; double y; double z; }; //点绕任意向量旋转,右手系 //输入参数old_x,old_y,old_z为旋转前空间点的坐标 //vx,vy,vz为旋转轴向量 //theta为旋转角度角度制,范围在-180到180 //返回值为旋转后坐标点 Point3f RotateByVector( double old_x, double old_y, double old_z, double vx, double vy, double vz, double theta) { double r = theta * CV_PI / 180; double c = cos (r); double s = sin (r); double new_x = (vx*vx*(1 - c) + c) * old_x + (vx*vy*(1 - c) - vz*s) * old_y + (vx*vz*(1 - c) + vy*s) * old_z; double new_y = (vy*vx*(1 - c) + vz*s) * old_x + (vy*vy*(1 - c) + c) * old_y + (vy*vz*(1 - c) - vx*s) * old_z; double new_z = (vx*vz*(1 - c) - vy*s) * old_x + (vy*vz*(1 - c) + vx*s) * old_y + (vz*vz*(1 - c) + c) * old_z; return Point3f(new_x, new_y, new_z); } |