2017-12-31 41 views
0

POV-Rayのある特定の点から別の点にオブジェクトを移動する回転を見つけることは、驚くほど困難です。POV-Rayでベクトルの周りのオブジェクトを回転させる方法は?

幾何学的には、それを見つけるのは十分に簡単です:私はPointT(緑)目標点に原点からの距離Distを計算し、<Dist, 0, 0>(青)でPoint0を作成します。次に、Point0PointTから、それらとそれらの垂線との間の角度を計算します。 AngleD​​動き回る= PointTPoint1からPoint0による回転。

POV-Rayので、私はPoint1を計算するvaxis_rotateを使用することができます。しかし、私は実際にオブジェクトを回転させたい(もちろん球ではありません)、これを行うための明白な方法はありません。私はrotate -AngleD*Perpを試しましたが、それは少し異なる結果(赤色)を与えます。

私がポイントに何vaxis_rotate、オブジェクトに行うことができますどのように?

#declare PointT = <2, 2, 2>; 

#declare Dist = VDist(<0, 0, 0>, PointT); 
#declare Point0 = <Dist, 0, 0>; 
#declare AngleD = VAngleD(PointT, Point0); 
#declare Perp = VPerp_To_Plane(PointT, Point0); 
#declare Point1 = vaxis_rotate(Point0, Perp, -AngleD); 

sphere{Point0, R pigment{color Blue} } 
sphere{Point1, R pigment{color Green} } 

sphere{ 
    Point0, R 
    rotate -AngleD*Perp 
    pigment{color Red} 
} 

enter image description here

+1

直接回転を指定する唯一の方法はであるように思える[オイラー角(http://www.povray.org/documentation/ビュー/3.6.1/49/)。必要があれば、[明示的な回転行列](https://sites.google.com/site/glennmurray/Home/rotation-matrices-and-formulas/rotation-about-an-arbitrary-axis-in-3)を生成することができます。次元)。 – meowgoesthedog

答えて

0

meowgoesthedogによって提供されるリンクに回転行列は、期待される結果を与えます。上の例から球に適用

#macro RotMatFromVectorAndAngle(Vector, Angle) 

    // takes normalized vector and angle in radians 

    #local U = Vector.x; 
    #local V = Vector.y; 
    #local W = Vector.z; 
    #local Sin = sin(Angle); 
    #local Cos = cos(Angle); 

    #local M11 = U*U + (1-U*U)*Cos; 
    #local M12 = U*V*(1-Cos) - W*Sin; 
    #local M13 = U*W*(1-Cos) + V*Sin; 

    #local M21 = U*V*(1-Cos) + W*Sin; 
    #local M22 = V*V + (1-V*V)*Cos; 
    #local M23 = V*W*(1-Cos) - U*Sin; 

    #local M31 = U*W*(1-Cos) - V*Sin; 
    #local M32 = V*W*(1-Cos) + U*Sin; 
    #local M33 = W*W + (1-W*W)*Cos; 

    matrix <M11, M12, M13, 
      M21, M22, M23, 
      M31, M32, M33, 
      0 , 0 , 0 > 

#end 

#declare Angle = VAngle(PointT, Point0); 
#declare Perp = VPerp_To_Plane(PointT, Point0); 
sphere{ 
    Point0, R 
    RotMatFromVectorAndAngle(Perp, Angle) 
} 
関連する問題