1.3 図形の変換
著者:梅谷 武
語句:図形の変換の仕方について記す。
モデリング変換, 行列スタック, 並進, 回転, オイラー角, 四元数, 拡大縮小
作成:2010-09-28
更新:2011-03-08
 図形を定義するときには、その図形そのものあるいはその部品をそれらが定義しやすい座標系で定義し、最終的に世界座標系にモデリング変換もでりんぐへんかん, modeling transformationする手法を使うのが一般的である。この場合、図形が階層構造をもつときに、上位のモデリング変換行列を一時的に行列スタックぎょうれつすたっく, matrix stackに退避し、下位のモデリング変換行列を適用後、退避していた行列を復帰して処理を進める。現在設定されているモデリング変換行列を、行列スタックに退避するのがPushMatrix関数、復帰するのがPopMatrix関数である。
 このようなやり方で図形を定義する場合、行列スタックや変換行列の整合性は利用者に委ねられるため注意が必要である。

PushMatrix

書式 PushMatrix()

PopMatrix

書式 PopMatrix()
並進へいしん, translationはTranslate関数による。

Translate

書式 Translate( x, y, z )
座標系 右手系
 与えられた移動ベクトルに対応する並進行列を図形に作用させる。

sample128.lua

package.path = "std/?.lua"
require( "Geometry" )
 
function Rect()
SetMaterial( gold )
dxBox( 0.3, 0.2, 0.8 )
end
 
Rect()
PushMatrix()
Translate( 2.0, 0.0, 0.0 )
Rect()
PopMatrix()
PushMatrix()
Translate( 0.0, 2.0, 0.0 )
Rect()
PopMatrix()
PushMatrix()
Translate( 0.0, 0.0, 2.0 )
Rect()
PopMatrix()
 
tnNewObject()
sample128.lua
 任意軸に関する回転かいてん, rotationはRotate関数、座標軸に関する回転はRotateX, RotateY, RotateZ関数による。

Rotate

書式 Rotate( angle, x, y, z )
座標系 右手系

RotateX

書式 RotateX( angle )
座標系 右手系

RotateY

書式 RotateY( angle )
座標系 右手系

RotateZ

書式 RotateZ( angle )
座標系 右手系
 与えられた角度[度]と回転軸に対応する回転行列を図形に作用させる。

sample129.lua

package.path = "std/?.lua"
require( "Geometry" )
 
function Rect()
SetMaterial( gold )
dxBox( 0.3, 0.2, 0.8 )
end
 
Rect()
PushMatrix()
Translate( 2.0, 0.0, 0.0 )
RotateX( 60.0 )
Rect()
PopMatrix()
PushMatrix()
Translate( 0.0, 2.0, 0.0 )
RotateY( 60.0 )
Rect()
PopMatrix()
PushMatrix()
Translate( 0.0, 0.0, 2.0 )
RotateZ( 60.0 )
Rect()
PopMatrix()
 
tnNewObject()
sample129.lua
オイラー角おいらーかく, Euler angleによる変換は幾何ライブラリにより変換行列を計算し、MultMatrix関数あるいはdxMultMatrix関数により図形に作用させる。幾何ライブラリは右手系で計算し、MultMatrix関数は右手系の3×3変換行列を必要に応じて座標変換を施し、4×4変換行列としてプラットフォームに設定する。
 dxMultMatrix関数はDirectXに直接、変換行列を設定するが、DirectXは左手系であることに注意しなければならない。

MultMatrix

書式 MultMatrix( 3×3変換行列 )
座標系 右手系

dxMultMatrix

書式 dxMultMatrix(m11,m12,m13,m14,...,m41,m42,m43,m44)
座標系 左手系

sample130.lua

package.path = "std/?.lua"
require( "Geometry" )
PI_180 = 3.14159265358979 / 180.0
 
function Rect()
SetMaterial( gold )
dxBox( 0.3, 0.2, 0.8 )
end
 
Rect()
x = Matrix3x3.new( EulerAngles.new( 0.0, 60.0*PI_180, 0.0 ) )
PushMatrix()
Translate( 2.0, 0.0, 0.0 )
MultMatrix( x )
Rect()
PopMatrix()
y = Matrix3x3.new( EulerAngles.new( 0.0, 0.0, 60.0*PI_180 ) )
PushMatrix()
Translate( 0.0, 2.0, 0.0 )
MultMatrix( y )
Rect()
PopMatrix()
z = Matrix3x3.new( EulerAngles.new( 60.0*PI_180, 0.0, 0.0 ) )
PushMatrix()
Translate( 0.0, 0.0, 2.0 )
MultMatrix( z )
Rect()
PopMatrix()
 
tnNewObject()
sample130.lua
四元数しげんすう, quaternionによる変換も幾何ライブラリにより変換行列を計算し、MultMatrix関数により図形に作用させる。四元数による空間の回転を行なう場合、回転角は四元数の角の2倍になることに注意する。

sample131.lua

package.path = "std/?.lua"
require( "Geometry" )
PI_180 = 3.14159265358979 / 180.0
 
function Rect()
SetMaterial( gold )
dxBox( 0.3, 0.2, 0.8 )
end
 
Rect()
AX = Vector3.new( 1.0, 0.0, 0.0 )
AY = Vector3.new( 0.0, 1.0, 0.0 )
AZ = Vector3.new( 0.0, 0.0, 1.0 )
x = Matrix3x3.new( Quaternion.new( 30.0*PI_180, Axis(AZ/AY) ) )
PushMatrix()
Translate( 2.0, 0.0, 0.0 )
MultMatrix( x )
Rect()
PopMatrix()
y = Matrix3x3.new( Quaternion.new( 30.0*PI_180, Axis(AX/AZ) ) )
PushMatrix()
Translate( 0.0, 2.0, 0.0 )
MultMatrix( y )
Rect()
PopMatrix()
z = Matrix3x3.new( Quaternion.new( 30.0*PI_180, Axis(AY/AX) ) )
PushMatrix()
Translate( 0.0, 0.0, 2.0 )
MultMatrix( z )
Rect()
PopMatrix()
 
tnNewObject()
sample131.lua
 図形の座標軸方向の拡大縮小かくだいしゅくしょう, scalingはScale関数によって行なう。任意のアフィン変換は行列表現し、MultMatrix関数を使って行なう。

Scale

書式 Scale( x, y, z )

sample132.lua

package.path = "std/?.lua"
require( "Geometry" )
 
PushMatrix()
SetMaterial( chrome )
Scale( 0.5, 2.0, 1.0 )
dxSphere( 0.5, 36, 36 )
PopMatrix()
 
tnNewObject()
sample132.lua
語  句
モデリング変換 もでりんぐへんかん, modeling transformation
行列スタック ぎょうれつすたっく, matrix stack
並進 へいしん, translation
回転 かいてん, rotation
オイラー角 おいらーかく, Euler angle
四元数 しげんすう, quaternion
拡大縮小 かくだいしゅくしょう, scaling
 
Published by SANENSYA Co.,Ltd.