3D (点描、線描、面描)

  1. 導入
  2. 準備
  3. サンプルプログラム
  4. 問題

1. 導入

空間に点・線・面を描いて、次のような3D物体を表示してみましょう。

pointCube.gif lineCube.gif planeCube.gif

2. 準備

サンプルプログラムのソースをファイルインします。

| 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
browser.png

3. サンプルプログラム
4. 問題

サンプルプログラムを見てみましょう。
ThreeDimension クラスの examples カテゴリに登録されています。
システムブラウザで「Foo-3D」→「ThreeDimension」→ class タブ選択 →「examples」をたどってください。

問題も同じカテゴリに登録されています。


example0 :軸

空間に軸を表示します。

プログラム:"ThreeDimension example0."

| aBody |
aBody := JunOpenGL3dCompoundObject new.
aBody add: JunOpenGL3dObject axes.
aBody show.
^aBody
axes.jpg axes.gif

軸の色が RGB カラー(Red: X軸, Green: Y軸, Blue: Z軸)で表現されています。
グラブボタン( grabButton.jpg )やホィール( horizontalThumbWheel.jpg )などを使って、軸を回転させて、3次元に描かれていることを確認しましょう。


example1 :点描

軸の先に点を表示します。

プログラム:"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
point01.jpg

example2 :点描

空間に点をいくつか表示します。

プログラム:"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
point02.jpg

example3 :点描の練習問題

プログラム:"ThreeDimension example3."

図のような立方体を点で描画するプログラムを作成してください。

pointCube.jpg pointCube.gif

example4 :線描

空間に線を表示します。

プログラム:"ThreeDimension example4."

| aBody |
aBody := JunOpenGL3dCompoundObject new.
aBody add: JunOpenGL3dObject axes.
aBody add: (-1 , 0 , 1 to: 1 , 0 , 1) asJunOpenGL3dObject.
aBody show.
^aBody
line01.jpg

example5 :線描の練習問題

プログラム:"ThreeDimension example5."

図のような立方体を線で描画するプログラムを作成してください。

lineCube.jpg lineCube.gif

example6 :面描

空間に面を表示します。

プログラム:"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
plane01.jpg

example7 :面描の練習問題

プログラム:"ThreeDimension example7."

図のような立方体を面で描画するプログラムを作成してください。

planeCube.jpg planeCube.gif

Updated: 2015/11/08 (Created: 2008/04/01) KSU AokiHanko