1.1 基本図形
著者:梅谷 武
語句:基本図形の描画方法について記す。
世界座標系, ToposNote, DirectX, 左手系, 右手系, 点, 直線, 多角形, 三角形メッシュ, 正多角形, 直方体, 球, 円柱, ティーポット, 多面体, 標高データ
作成:2010-09-25
更新:2011-03-08
 ToposNoteにおいては、空間内に世界座標系せかいざひょうけい, world coodinate systemと呼ばれる右手系の正規直交座標系を定め、それを基準とする。世界座標系の各座標軸はX軸、Y軸、Z軸と呼ばれ、X-Y平面が水平面、Z軸が鉛直方向の上方向、Y軸は北方向、X軸は東方向に対応している。
 これに対して、ToposNoteを実装するハードウェアであるは左手系を採用しており、下図のように対応している。
 幾何ライブラリにおいては、接頭辞にdxが付いている関数はDirectXにパラメータをそのまま渡して実行するために左手系ひだりてけい, left-handed systemの座標系を使用し、それ以外の関数はToposNoteの右手系みぎてけい, right-handed systemを使用しているので注意が必要である。
 Luaによる右手系のラッパー関数でプラットフォームに依存しないインターフェースを作るのが理想的であるが、実際にプログラミングする際にはプラットフォームを直接制御することが必要となる場合が多い。
てん, pointは小さい球として描く。このためのPoint関数が用意されている。

Point

書式(1) Point( 位置, 色 )
書式(2) Point( 位置, 色, 半径 )
書式(3) Point( 位置, 色, 半径, 縦分割数 )
書式(4) Point( 位置, 色, 半径, 縦分割数, 横分割数 )
座標系 右手系
 指定した位置・色の小球を描く。既定値は半径=0.01、縦分割数=24、横分割数=24。半径、縦分割数、横分割数を指定することができる。

sample111.lua

package.path = "std/?.lua"
require( "Geometry" )
 
white  = Vector3.new( 1.0, 1.0, 1.0 )
yellow = Vector3.new( 1.0, 1.0, 0.0 )
v0     = Vector3.new( 0.1, 0.1, 0.1 )
dv = v0
 
Point( v0, white )
v0 = v0 + dv
Point( v0, yellow )
v0 = v0 + dv
Point( v0, white,  0.02 )
v0 = v0 + dv
Point( v0, yellow, 0.02 )
v0 = v0 + dv
Point( v0, white,  0.04, 6, 6 )
v0 = v0 + dv
Point( v0, yellow, 0.04, 6, 6 )
 
tnNewObject()
sample111.lua
直線ちょくせん, lineはLine関数で描く。

Line

書式(1) Line( 始点, 終点, 色 )
書式(2) Line( 始点, 終点, 色, 太さ )
書式(3) Line( 始点, 終点, 色, 太さ, 破線型H, 破線型L )
書式(4) Line( 始点, 終点, 色, 太さ, 破線型H, 破線型L, 破線型係数 )
座標系 右手系
 指定した始点・終点・色の直線を描く。既定値は太さ=0.01、破線型H=0xffff、破線型L=0xffff、破線型係数=1.0。太さ, 破線型H, 破線型L, 破線型係数を指定することができる。破線型は32bitのパターンで1は描画、0は描画しないことを意味する。これを上位16bitと下位16bitに分けて指定する。破線型係数とは破線型を拡大縮小する係数である。

sample112.lua

package.path = "std/?.lua"
require( "Geometry" )
 
white = Vector3.new( 1.0, 1.0, 1.0 )
red   = Vector3.new( 1.0, 0.0, 0.0 )
v0    = Vector3.new( 0.1, 0.0, 0.0 )
v1    = Vector3.new( 0.1, 1.0, 0.0 )
dx    = Vector3.new( 0.1, 0.0, 0.0 )
 
Line( v0, v1, white )
v0 = v0 + dx; v1 = v1 + dx
Line( v0, v1, red )
v0 = v0 + dx; v1 = v1 + dx
Line( v0, v1, white, 2.0, 0xf0f0, 0xf0f0 )
v0 = v0 + dx; v1 = v1 + dx
Line( v0, v1, red,   2.0, 0xf0f0, 0xf0f0 )
v0 = v0 + dx; v1 = v1 + dx
Line( v0, v1, white, 3.0, 0xf0f0, 0xf0f0, 2.0 )
v0 = v0 + dx; v1 = v1 + dx
Line( v0, v1, red,   3.0, 0xf0f0, 0xf0f0, 2.0 )
 
tnNewObject()
sample112.lua
多角形たかくけい, polygon三角形メッシュさんかくけいめっしゅ, triangle meshとして描く。dxTriangleMesh関数によりDirectXのメッシュを直接生成することができる。

dxTriangleMesh

書式 dxTriangleMesh( 頂点数, 頂点配列, 面数, 面配列 )
座標系 左手系
 一つの頂点データは(頂点ベクトル, 法線ベクトル, テクスチャ座標)という八個の浮動小数点数の組である。頂点配列は8×頂点数個の浮動小数点数の配列になる。面データは三個の頂点番号の組である。頂点番号とは0から始まる配列の添字のことである。面配列は3×面数個の整数配列になる。
 DirectXに直接渡すために座標を左手系で記述し(Y軸とZ軸を入れ換える)、三角形の向きを右手系の逆にしなければならないことに注意せよ。

sample113.lua

dxSetColor( 1.0, 1.0, 0.0 )
dxTriangleMesh(
4,
{ 0.2, 0.0, 0.2, 0.0, 1.0, 0.0, 0.0, 0.0,
0.2, 0.0, 0.8, 0.0, 1.0, 0.0, 0.0, 0.0,
0.8, 0.0, 0.8, 0.0, 1.0, 0.0, 0.0, 0.0,
0.8, 0.0, 0.2, 0.0, 1.0, 0.0, 0.0, 0.0 },
2,
{ 0, 1, 2, 0, 2, 3 }
)
 
tnNewObject()
sample113.lua
正多角形せいたかくけい, regular polygonはdxPolygon関数で描くことができる。

dxPolygon

書式 dxPolygon( 辺長, 辺数 )
座標系 左手系
 指定した辺長と辺数の正多角形を原点を中心とするXY平面上に描く。

sample114.lua

package.path = "std/?.lua"
require( "Geometry" )
 
function Square( x, y, z )
PushMatrix()
Translate( x, y, z )
RotateZ( 45.0 )
RotateX( 90.0 )
dxPolygon( 0.6, 4 )
PopMatrix()
end
 
dxSetColor( 1.0, 1.0, 0.0 )
Square( 0.5, 0.5, 0.0 )
 
tnNewObject()
sample114.lua

dxBox

書式 dxBox( X軸方向幅, Y軸方向高さ, Z軸方向深さ )
座標系 左手系
 指定した幅、高さ、深さの直方体ちょくほうたい, rectangularを原点を中心として描く。

sample115.lua

package.path = "std/?.lua"
require( "Geometry" )
 
SetMaterial( chrome )
dxBox( 0.6, 0.4, 1.0 )
 
tnNewObject()
sample115.lua

dxSphere

書式 dxSphere( 半径, 縦分割数, 横分割数 )
座標系 左手系
 指定した半径、縦分割数、横分割数のきゅう, sphereを原点を中心として描く。

sample116.lua

package.path = "std/?.lua"
require( "Geometry" )
 
SetMaterial( chrome )
dxSphere( 0.5, 36, 36 )
 
tnNewObject()
sample116.lua

dxCylinder

書式 dxCylinder( 負面半径, 正面半径, 長さ, スライス数, スタック数 )
座標系 左手系
 指定した負面半径、正面半径、長さ、スライス数、スタック数の円柱えんちゅう, cylinderを原点を中心として描く。負面・正面とはZ軸に関するものであり、スライス数は主軸を回転軸とするときの円周の分割数であり、スタック数は主軸に沿った分割数である。

sample117.lua

package.path = "std/?.lua"
require( "Geometry" )
 
SetMaterial( chrome )
dxCylinder( 0.2, 0.4, 2.0, 24, 12 )
 
tnNewObject()
sample117.lua

dxTeapot

書式 dxTeapot()
座標系 左手系
 原点を中心としてティーポットてぃーぽっと, teapotを描く。

sample118.lua

package.path = "std/?.lua"
require( "Geometry" )
 
SetMaterial( chrome )
dxTeapot()
 
tnNewObject()
sample118.lua

dxText

書式 dxText( TrueTypeフォント名, サイズ, 文字列, 最大偏差, 深さ )
座標系 左手系
 原点を中心として指定したTrueTypeフォント名、サイズ、文字列、最大偏差、深さの文字列を描く。TrueTypeフォント名と文字列にはシフトJISコードを使うことができる。最大偏差とはアウトラインフォントからの許容誤差の最大偏差を意味し、深さはZ軸方向の深さを意味する。

sample119.lua

package.path = "std/?.lua"
require( "Geometry" )
 
SetMaterial( chrome )
dxText( "tahoma", 24.0, "幾何", 5.0, 0.4 )
 
tnNewObject()
sample119.lua
多面体ためんたい, polyhedronは三角形メッシュとして描く。

sample120.lua

package.path = "std/?.lua"
require( "Geometry" )
 
SetMaterial( chrome )
a = math.sqrt( 3.0 ) / 3.0
dxTriangleMesh(
8,
{ -a,  -a,  -a,  -a,  -a,  -a, 0.0, 0.0,
-a,   a,  -a,  -a,   a,  -a, 0.0, 0.0,
a,   a,  -a,   a,   a,  -a, 0.0, 0.0,
a,  -a,  -a,   a,  -a,  -a, 0.0, 0.0,
-a,  -a,   a,  -a,  -a,   a, 0.0, 0.0,
-a,   a,   a,  -a,   a,   a, 0.0, 0.0,
a,   a,   a,   a,   a,   a, 0.0, 0.0,
a,  -a,   a,   a,  -a,   a, 0.0, 0.0  },
12,
{ 0, 1, 2, 0, 2, 3,
1, 5, 6, 1, 6, 2,
5, 4, 7, 5, 7, 6,
4, 0, 3, 4, 3, 7,
0, 4, 5, 0, 5, 1,
2, 6, 7, 2, 7, 3,
}
)
 
tnNewObject()
sample120.lua
 注釈文字列はdxPrint関数あるいはPrint関数で描く。ともにシフトJISコードを使うことができる。

dxPrint

書式 dxPrint( x座標, y座標, z座標, r成分, g成分, b成分, 文字列 )
座標系 左手系

sample121.lua

package.path = "std/?.lua"
require( "Geometry" )
 
SetMaterial( chrome )
a = math.sqrt( 3.0 ) / 3.0
dxTriangleMesh(
8,
{ -a,  -a,  -a,  -a,  -a,  -a, 0.0, 0.0,
-a,   a,  -a,  -a,   a,  -a, 0.0, 0.0,
a,   a,  -a,   a,   a,  -a, 0.0, 0.0,
a,  -a,  -a,   a,  -a,  -a, 0.0, 0.0,
-a,  -a,   a,  -a,  -a,   a, 0.0, 0.0,
-a,   a,   a,  -a,   a,   a, 0.0, 0.0,
a,   a,   a,   a,   a,   a, 0.0, 0.0,
a,  -a,   a,   a,  -a,   a, 0.0, 0.0  },
12,
{ 0, 1, 2, 0, 2, 3,
1, 5, 6, 1, 6, 2,
5, 4, 7, 5, 7, 6,
4, 0, 3, 4, 3, 7,
0, 4, 5, 0, 5, 1,
2, 6, 7, 2, 7, 3,
}
)
 
dxPrint( -a-0.1, -a-0.1, -a-0.1, 1.0, 1.0, 1.0, "0" )
dxPrint( -a-0.1,  a+0.1, -a-0.1, 1.0, 1.0, 1.0, "1" )
dxPrint(  a+0.1,  a+0.1, -a-0.1, 1.0, 1.0, 1.0, "2" )
dxPrint(  a+0.1, -a-0.1, -a-0.1, 1.0, 1.0, 1.0, "3" )
dxPrint( -a-0.1, -a-0.1,  a+0.1, 1.0, 1.0, 1.0, "4" )
dxPrint( -a-0.1,  a+0.1,  a+0.1, 1.0, 1.0, 1.0, "5" )
dxPrint(  a+0.1,  a+0.1,  a+0.1, 1.0, 1.0, 1.0, "6" )
dxPrint(  a+0.1, -a-0.1,  a+0.1, 1.0, 1.0, 1.0, "7" )
dxPrint(    0.0, -a-0.1, -a-0.1, 1.0, 1.0, 1.0, "立方体" )
 
tnNewObject()
sample121.lua

Print

書式(1) Print( 位置, 文字列 )
書式(2) Print( 位置, 文字列, 色 )
座標系 右手系

sample122.lua

package.path = "std/?.lua"
require( "Geometry" )
 
white = Vector3.new( 1.0, 1.0, 1.0 )
v0    = Vector3.new( 0.1, 0.0, 0.0 )
v1    = Vector3.new( 0.1, 1.0, 0.0 )
dx    = Vector3.new( 0.0, 0.1, 0.0 )
 
Point( v0, white )
Point( v1, white )
Line( v0, v1, white )
Print( v0 - dx, "v0" )
Print( v1 + dx, "v1" )
 
tnNewObject()
sample122.lua

HeightMesh

書式 HeightMesh( x0, y0, x1, y1, w, h, 標高データ配列 )
座標系 右手系
 ToposNoteの世界座標系におけるXY平面上、指定された矩形領域上の標高ひょうこう, altitudeデータを使ってメッシュを描画する。

sample123.lua

package.path = "std/?.lua"
require( "Geometry" )
 
SetMaterial( chrome )
HeightMesh(
0.0, 0.0, 1.0, 1.0, 4, 3, {
0.1, 0.2, 0.3, 0.2,
0.2, 0.3, 0.2, 0.1,
0.3, 0.2, 0.1, 0.0
} )
 
tnNewObject()
sample123.lua
語  句
世界座標系 せかいざひょうけい, world coodinate system
左手系 ひだりてけい, left-handed system
右手系 みぎてけい, right-handed system
てん, point
直線 ちょくせん, line
多角形 たかくけい, polygon
三角形メッシュ さんかくけいめっしゅ, triangle mesh
正多角形 せいたかくけい, regular polygon
直方体 ちょくほうたい, rectangular
きゅう, sphere
円柱 えんちゅう, cylinder
ティーポット てぃーぽっと, teapot
多面体 ためんたい, polyhedron
標高 ひょうこう, altitude
 
Published by SANENSYA Co.,Ltd.