ピラミッドの垂直回転 †
y軸上の値の計算方法 †
ピラミッド(四角すい)を垂直回転(x軸を中心にして回転)させます。
ピラミッドの垂直方向の回転を考える前に、高さのある(z軸方向がプラス)点が、座標がx軸を中心にして回転したときに、画面上どの位置になるかを考えます。
ピタゴラスの定理より原点Oから
点p(y,z)までの長さrは
r 2 = y2 + z2
r = √(y2 + z2 )
角度θは
正接(タンジェント):tan θ = z / y
逆正接(アークタンジェント):θ = tan-1 z/y
点pのy軸上の値は
y = r cos( θ )
以上より、軸がΔθ傾いた時の点p'(y',z')の
元の座標y-zのy軸上への写像y"は
y" = r cos( θ + Δθ)
これをJavascriptで記述すると、
y : 元のy軸上の値
z : 元のz軸上の値
deg : y'-z'座標の傾き角度
の時
var r = Math.sqrt( y*y + z*z);
var t = Math.atan2(z,y) + deg * Math.PI / 180;
ここでzとyの順番に注意すること。
new_y = r * Math.cos( t );
右のViewbox内でマウスを押下した状態で左右に動かしてみて下さい。
Vertical Rotation Logic Analysis
y軸の傾きΔθ = 0°
y" = 200
r
y
y"
z
O
θ
p(200,100)
/* foot */
/* visible/hidden */
/* X axis */
/* Y axis */
/* Angle */
/* visible/hidden */
/* X axis */
/* X axis */
/* Y axis */
/* Angle */
ピラミッドの垂直回転 †
ピラミッドを垂直回転させてみましょう。
下のViewbox内でマウスを押下した状態で上下に動かしてみて下さい。
ピラミッドのサイズは縦 x 横 x 高さ = 200 x 200 x 100 pxです。
各面の表示順は背面、左右の面、前面の順番です。
陰線処理をしていないので、背面(青色)が他の面よりも前面になった時でも背面が隠れてしまいます。
225°~-45°の間は正しく表示されます。とりあえずここでは0°~90°で正しく表示できれば良しとします。
元の座標を記憶しておく方法は色々ありますが、ここでは以下のようにpathノードの中にpointsという本来含まれない属性(pointsとは別の名前でもよい)を記述し、その中に各点のx、y、z座標の値を入れておきます。
<path id="angle1" d="M 0,0 L 100,100 -100,100" fill="blue"
points="0,0,100 100,100,0 -100,100,0"/>
そしてgetAttributeメソッドで
var attrPoints = angle.getAttribute("points");
というようにしてpoints全体の値を取得します。その後、splitメソッドを2回行い各値を計算します。
他に何かいい方法があればその方法でもかまいません。
Vertical Pylamid Lotation
x軸の回転Δθ = 0°
/* visible/hidden */
/* 上 */
/* 左 */
/* 右 */
/* 下 */
O
x
y
/* visible/hidden */
/* X axis & Arrow */
/* Y axis & Arrow */