Computer Graphics Workshop '96 PS2 Solutions

1/12/96

Problems
Problem 1 - Modifying the scene

;;; Problem 2-1

(define M_PI 3.14159265358979323846)

;; create viewer and show it

(define viewer (new-SoXtExaminerViewer))
(-> viewer 'show)

;; root of scene graph

(define root (new-SoSeparator))
(-> root 'ref)

;; separator and nodes for left eye

(define left-eye-sep (new-SoSeparator))
(-> root 'addChild left-eye-sep)
(define left-eye-mat (new-SoMaterial))
(-> left-eye-sep 'addChild left-eye-mat)
(define left-eye-xform (new-SoTransform))
(-> left-eye-sep 'addChild left-eye-xform)
(-> left-eye-sep 'addChild (new-SoSphere))

;; separator and nodes for right eye

(define right-eye-sep (new-SoSeparator))
(-> root 'addChild right-eye-sep)
(define right-eye-mat (new-SoMaterial))
(-> right-eye-sep 'addChild right-eye-mat)
(define right-eye-xform (new-SoTransform))
(-> right-eye-sep 'addChild right-eye-xform)
(-> (-> right-eye-xform 'translation) 'setValue 3 0 0)
(-> right-eye-sep 'addChild (new-SoSphere))

;; separator and nodes for nose

(define nose-sep (new-SoSeparator))
(-> root 'addChild nose-sep)
(define nose-mat (new-SoMaterial))
(-> nose-sep 'addChild nose-mat)
(define nose-xform (new-SoTransform))
(-> nose-sep 'addChild nose-xform)
(-> (-> nose-xform 'translation) 'setValue 1.5 -3 0)
(-> nose-sep 'addChild (new-SoCone))

; turn nose upside down: rotation about x axis by 
; 180 degrees (pi radians)

(-> (-> nose-xform 'rotation) 'setValue (new-SbVec3f 1 0 0) M_PI)

;; separator and nodes for mouth

(define mouth-sep (new-SoSeparator))
(-> root 'addChild mouth-sep)
(define mouth-mat (new-SoMaterial))
(-> mouth-sep 'addChild mouth-mat)
(define mouth-xform (new-SoTransform))
(-> (-> mouth-xform 'translation) 'setValue 1.5 -6 0)
(-> mouth-sep 'addChild mouth-xform)
(-> mouth-sep 'addChild (new-SoCube))

;; show scene graph

(-> viewer 'setSceneGraph root)

;; rotating cube so it stands on edge -- about z axis
;; this rotation is replaced by the next one, so re-evaluate
;; the following line to see its effect.

(-> (-> mouth-xform 'rotation) 'setValue (new-SbVec3f 0 0 1) 
                                         (/ M_PI 4))

;; rotating cube so it stands on corner
;; I used a TrackballManip to get these values.
;; Example of doing this:
;; (define my-manip (new-SoTrackballManip))
;; (define my-axis (new-SbVec3f))
;; (define my-angle 0.0)
;; (-> (-> my-manip 'rotation) 'getValue my-axis my-angle)

(-> (-> mouth-xform 'rotation) 'setValue
    (new-SbVec3f
     -0.614901661872864
     0.315593332052231
     0.722701013088226)
    1.06886279582977)
Problem 2 - Using draggers to modify the scene

;;; Problem 2-2

(define M_PI 3.14159265358979323846)

;; create viewer and show it

(define viewer (new-SoXtExaminerViewer))
(-> viewer 'show)

;; root of scene graph

(define root (new-SoSeparator))
(-> root 'ref)

;; separator and nodes for left eye

(define left-eye-sep (new-SoSeparator))
(-> root 'addChild left-eye-sep)
(define left-eye-mat (new-SoMaterial))
(-> left-eye-sep 'addChild left-eye-mat)
(define left-eye-xform (new-SoTransform))
(-> left-eye-sep 'addChild left-eye-xform)
(define left-eye (new-SoSphere))
(-> left-eye-sep 'addChild left-eye)

; dragger to manipulate radius of left eye

(define left-eye-dragger (new-SoTranslate1Dragger))
(-> left-eye-sep 'addChild left-eye-dragger)
(-> (-> left-eye-dragger 'translation) 'setValue 1 -8 0)

; hooking up the dragger using a decompose engine

(define left-eye-decomp (new-SoDecomposeVec3f))
(-> (-> left-eye-decomp 'vector) 'connectFrom 
    (-> left-eye-dragger 'translation))
(-> (-> left-eye 'radius) 'connectFrom (-> left-eye-decomp 'x))

;; separator and nodes for right eye

(define right-eye-sep (new-SoSeparator))
(-> root 'addChild right-eye-sep)
(define right-eye-mat (new-SoMaterial))
(-> right-eye-sep 'addChild right-eye-mat)
(define right-eye-xform (new-SoTransform))
(-> right-eye-sep 'addChild right-eye-xform)
(-> (-> right-eye-xform 'translation) 'setValue 3 0 0)
(-> right-eye-sep 'addChild (new-SoSphere))

;; separator and nodes for nose

(define nose-sep (new-SoSeparator))
(-> root 'addChild nose-sep)
(define nose-mat (new-SoMaterial))
(-> nose-sep 'addChild nose-mat)
(define nose-xform (new-SoTransform))
(-> nose-sep 'addChild nose-xform)
(-> (-> nose-xform 'translation) 'setValue 1.5 -3 0)
(define nose (new-SoCone))
(-> nose-sep 'addChild nose)

; turn nose upside down: rotation about x axis by
; 180 degrees (pi radians)

(-> (-> nose-xform 'rotation) 'setValue (new-SbVec3f 1 0 0) M_PI)

; dragger to manipulate radius of nose

(define nose-radius-dragger (new-SoTranslate1Dragger))
(-> nose-sep 'addChild nose-radius-dragger)
   ; remember,
   ; nose is upside down!
(-> (-> nose-radius-dragger 'translation) 'setValue 1 6.5 0)


; hooking up the dragger using a decompose engine
(define nose-radius-decomp (new-SoDecomposeVec3f))
(-> (-> nose-radius-decomp 'vector) 'connectFrom
    (-> nose-radius-dragger 'translation))
(-> (-> nose 'bottomRadius) 'connectFrom
    (-> nose-radius-decomp 'x))

;; separator and nodes for mouth

(define mouth-sep (new-SoSeparator))
(-> root 'addChild mouth-sep)
(define mouth-mat (new-SoMaterial))
(-> mouth-sep 'addChild mouth-mat)
(define mouth-xform (new-SoTransform))
(-> (-> mouth-xform 'translation) 'setValue 1.5 -6 0)
(-> mouth-sep 'addChild mouth-xform)
(-> mouth-sep 'addChild (new-SoCube))

;; show scene graph

(-> viewer 'setSceneGraph root)

;; change mode of viewer

(-> viewer 'setViewing 0)
Problem 3 - Further modifications with draggers

;;; Problem 2-3

;; Cone with a Translate1Dragger for translation;
;; this dragger moves along with the cone.
;; RotateCylindricalDragger combined with engines for
;; rotation about the cone's x axis. This dragger does
;; not translate along with the cone.

(define viewer (new-SoXtExaminerViewer))
(-> viewer 'show)

(define root (new-SoSeparator))
(-> root 'ref)

(define drag (new-SoTranslate1Dragger))
(-> root 'addChild drag)

;; Create subgraph for cone.
;; Note that we place the transform for the cone under a
;; separator, so it doesn't affect anything after it.

(define cone-sep (new-SoSeparator))
(-> root 'addChild cone-sep)

;; A transform node just for vertically positioning the cone.

(define transform2 (new-SoTransform))
(-> (-> transform2 'translation) 'setValue 0 2 0)
(-> cone-sep 'addChild transform2)

;; The transform that deals with the cone's rotation.

(define transform (new-SoTransform))
(-> cone-sep 'addChild transform)

(define cone (new-SoCone))
(-> cone-sep 'addChild cone)

;; Connect the translation field of the transform node to the
;; translation field of the dragger node.

(-> (-> transform 'translation) 'connectFrom
    (-> drag 'translation))

;; Transform for RotateCylindrical dragger;
;; dragger appears to the right of the cone.

(define cd-xform (new-SoTransform))
(-> root 'addChild cd-xform)

;; Create and place new dragger

(define cdrag (new-SoRotateCylindricalDragger))     
(-> root 'addChild cdrag)
(-> (-> cd-xform 'translation) 'setValue 4 1 0)

;; DecomposeRotation engine for getting axis/angle of
;; RotateCylindricalDragger's rotation

(define decomprot (new-SoDecomposeRotation))
(-> (-> decomprot 'rotation) 'connectFrom (-> cdrag 'rotation))

;; DecomposeVec3f engine for decomposing the axis.
;; We need to do this because of a "feature" of the 
;; DecomposeRotation engine; the axis flips 180
;; degrees during a 360 degree rotation.

(define decomp2 (new-SoDecomposeVec3f))
(-> (-> decomp2 'vector) 'connectFrom (-> decomprot 'axis))

;; ComposeVec3f engine for making the new axis of rotation.
;; Note that we only connect up the relevant value.

(define comp2 (new-SoComposeVec3f))
(-> (-> comp2 'x) 'connectFrom (-> decomp2 'y))

;; ComposeRotation engine for combining new axis and old angle

(define comprot (new-SoComposeRotation))
(-> (-> comprot 'axis) 'connectFrom (-> comp2 'vector))
(-> (-> comprot 'angle) 'connectFrom (-> decomprot 'angle))

;; Connect up the rotation field of the cone's transform 

(-> (-> transform 'rotation) 'connectFrom (-> comprot 'rotation))

;; Show the scene

(-> viewer 'setSceneGraph root)

;; Change the viewing mode of the viewer

(-> viewer 'setViewing 0)

Back to the CGW '96 home page

$Id: index.html,v 1.3 1996/01/14 04:45:43 kbrussel Exp $