空間に点・線・面を描いて、次のような3D物体を表示してみましょう。
|
|
サンプルプログラムのソースをファイルインします。
| aString aURL aFilename aBrowser aWindow aPackage aNavigator aClass aProtocol aSelector |
aString := 'http://www.cc.kyoto-su.ac.jp/~atsushi/Programs/VisualWorks/Exercises/Exercise_3D/Exercise-3D.st'.
aURL := JunURL named: aString.
aURL exists ifFalse: [^nil].
aFilename := Filename defaultDirectory construct: aURL asURI tail.
aURL downloadTo: aFilename.
aFilename exists ifFalse: [^nil].
aFilename fileIn.
aBrowser := #{Refactory.Browser.RefactoringBrowser} value open.
aWindow := aBrowser builder ifNil: [^nil] ifNotNil: [:aBuilder | aBuilder window].
aWindow displayBox: (JunGeometry alignedBoxWithScreenCenter: 800 @ 600).
aPackage := Store.Registry packageNamed: 'Foo-3D'.
aPackage ifNil: [^nil].
aNavigator := aBrowser navigator.
aNavigator selectPundle: aPackage.
aClass := #{ThreeDimension} value class.
aProtocol := #examples.
aSelector := #example0.
(aNavigator state)
classesAndNameSpaces: (Array with: aClass);
protocols: (Array with: aProtocol);
selectors: (Array with: aSelector).
aNavigator
setState: aNavigator state;
changed
|
|
サンプルプログラムを見てみましょう。
ThreeDimension クラスの examples カテゴリに登録されています。
システムブラウザで「Foo-3D」→「ThreeDimension」→ class タブ選択 →「examples」をたどってください。
問題も同じカテゴリに登録されています。
空間に軸を表示します。
プログラム:"ThreeDimension example0."
| aBody | aBody := JunOpenGL3dCompoundObject new. aBody add: JunOpenGL3dObject axes. aBody show. ^aBody
|
|
軸の色が RGB カラー(Red: X軸, Green: Y軸, Blue: Z軸)で表現されています。
グラブボタン(
)やホィール(
)などを使って、軸を回転させて、3次元に描かれていることを確認しましょう。
軸の先に点を表示します。
プログラム:"ThreeDimension example1."
| aBody | aBody := JunOpenGL3dCompoundObject new. aBody add: JunOpenGL3dObject axes. aBody add: (1 , 0 , 0) asJunOpenGL3dObject. aBody add: (0 , 1 , 0) asJunOpenGL3dObject. aBody add: (0 , 0 , 1) asJunOpenGL3dObject. aBody add: (-1 , 0 , 0) asJunOpenGL3dObject. aBody add: (0 , -1 , 0) asJunOpenGL3dObject. aBody add: (0 , 0 , -1) asJunOpenGL3dObject. aBody show. ^aBody
|
|
空間に点をいくつか表示します。
プログラム:"ThreeDimension example2."
| aBody |
aBody := JunOpenGL3dCompoundObject new.
aBody add: JunOpenGL3dObject axes.
(-1 to: 1 by: 0.1)
do: [:aNumber | aBody add: (aNumber , 0 , 1) asJunOpenGL3dObject].
aBody show.
^aBody
|
|
プログラム:"ThreeDimension example3."
図のような立方体を点で描画するプログラムを作成してください。
|
|
空間に線を表示します。
プログラム:"ThreeDimension example4."
| aBody | aBody := JunOpenGL3dCompoundObject new. aBody add: JunOpenGL3dObject axes. aBody add: (-1 , 0 , 1 to: 1 , 0 , 1) asJunOpenGL3dObject. aBody show. ^aBody
|
|
プログラム:"ThreeDimension example5."
図のような立方体を線で描画するプログラムを作成してください。
|
|
空間に面を表示します。
プログラム:"ThreeDimension example6."
| aBody |
aBody := JunOpenGL3dCompoundObject new.
aBody add: JunOpenGL3dObject axes.
aBody
add:
(Jun3dPolygon
points:
(Array
with: -1 , -1 , 1
with: 1 , -1 , 1
with: 1 , 1 , 1
with: -1 , 1 , 1)) asJunOpenGL3dObject.
aBody show.
^aBody
|
|
プログラム:"ThreeDimension example7."
図のような立方体を面で描画するプログラムを作成してください。
|
|