Copyright (c) 2003, Junzo SATO. All rights reserved.

Pangea with Java 3D

[Graphics:HTMLFiles/index_1.gif]

The Pangea 3D graphics was displayed using Java 3D API.
Texture generated by Mathematica was wrapped around the sphere, which automatically rotated.
Mouse operations; rotation (left click), translation (right click), and zoom (alt + left click) were enabled.

Junzo SATO

Aug 2nd 2003
July 28th 2003

•Pangea Algorithm

θ(rx_, ry_, rz_) := cos^(-1)((-rx cos(η) - ry sin(η))/(rz^2 + rx^2 cos^2(η) + ry^2 sin^2(η) + rx ry sin(2 η))^(1/2))

r := Module[{ϕ = Random[Real, {0, 2 π}], z = Random[Real, {-1, 1}]}, {(1 - z^2)^(1/2) cos(ϕ), (1 - z^2)^(1/2) sin(ϕ), z}]

rands = Table[r, {32}] ;

funcs = Map[Apply[θ, #] &, rands] ;

mat = Table[0, {360}, {180}] ;

<< Statistics`NormalDistribution`

gauss := Random[NormalDistribution[0, 1]]

newcut[nl_] := Module[{g = gauss},  If[Random[] < .5,  Join[Table[g, {#}], Table[0, {180 - #}]] & /@ nl,  Join[Table[0, {#}], Table[g, {180 - #}]] & /@ nl]]

Do[ nums = Table[Round[180 funcs[[k]]/π], {η, 0, 2 π - 2 π/360, 2 π/360}] ;  mat = mat + newcut[nums],  {k, 1, Length[funcs]}] ;

ConnectRGBColor[{iniR_, iniG_, iniB_}, {finR_, finG_, finB_}, var_] := RGBColor @@ ({iniR, iniG, iniB} (1 - var) + {finR, finG, finB} var)

earthColor[x_] := If[x <= .25, ConnectRGBColor[{0, 0, 0}, {0, 0, 1}, x/.25], If[x <= .65 ... 75) (x - .75)], ConnectRGBColor[{.90, .5, .15}, {.90, .5, .15} * 0.1, 1/(1 - .875) (x - .875)]]]]]

tex = ListDensityPlot[Reverse[Transpose[mat]], Mesh -> False, AspectRatio -> .5, ColorFunction -> (earthColor[#] &)]

[Graphics:HTMLFiles/index_14.gif]

-DensityGraphics -

max = Max[mat] ; min = Min[mat] ; lvl = Map[(# - min)/(max - min) &, mat, {2}] ;

texG = Show[Graphics[ Table[{earthColor[lvl[[i + 1, j + 1]]], EdgeForm[],  Polygon[{{i, j}, {i + 1, j}, {i + 1, j + 1}, {i, j + 1}}]}, {i, 0, 359}, {j, 0, 179}]],  AspectRatio -> .5]

[Graphics:HTMLFiles/index_18.gif]

-Graphics -

•J/Link

<< JLink`

InstallJava[CommandLine -> "/j2sdk1.4.2/bin/java"]

LinkObject[/j2sdk1.4.2/bin/java, 2, 2]

<< JLinkProgramming`JavaSwing`

Loading JavaSwing...

Finished loading JavaSwing

frame = NewMathJFrame["Java3D", 400, 300]

<<JavaObject[com.wolfram.jlink.MathJFrame] >>

Because the J/Link contains bug, JavaShow[] should be called twice here.

JavaShow[frame] ; JavaShow[frame]

•Java Image

<< JLinkProgramming`JavaPhotoEditor`

Welcome to the Java Photo Editor!

Loading JavaPhotoEditor...

Finished loading JavaPhotoEditor

colors = Table[earthColor[k], {k, 0, 1 - 1/256, 1/256}] /. RGBColor -> List ;

colorTable = Round[255 colors] ;

data = Transpose[Round[255 lvl]] ;

Dimensions[data]

{180, 360}

colorModel = JavaNew["java.awt.image.IndexColorModel", 8, 256, Flatten[colorTable],  ... avaNew["java.awt.image.MemoryImageSource", 360, 180, colorModel, Flatten[data], 0, 360]

<<JavaObject[java.awt.image.IndexColorModel] >>

<<JavaObject[java.awt.image.MemoryImageSource] >>

javaImage = frame @ getToolkit[] @ createImage[bitmap]

<<JavaObject[sun.awt.windows.WImage] >>

width = javaImage @ getWidth[]

360

height = javaImage @ getHeight[]

180

ShowJavaImage[javaImage]

[Graphics:HTMLFiles/index_50.gif]

-Graphics -

•Canvas3D

A SimpleUniverse which has VirtualUniverse, Locale, and View is created.

LoadJavaClass["com.sun.j3d.utils.universe.SimpleUniverse"] ; config = SimpleUniverse`getPreferredConfiguration[]

<<JavaObject[javax.media.j3d.J3dGraphicsConfig] >>

Canvas3D is created.

LoadJavaClass["javax.media.j3d.Canvas3D"] ; canvas = JavaNew["javax.media.j3d.Canvas3D", config]

<<JavaObject[javax.media.j3d.Canvas3D] >>

frame @ getContentPane[] @ add[canvas]

<<JavaObject[javax.media.j3d.Canvas3D] >>

frame @ getContentPane[] @ setPreferredSize[JavaNew["java.awt.Dimension", 400, 300]]

frame @ pack[]

•Universe

universe = JavaNew["com.sun.j3d.utils.universe.SimpleUniverse", canvas]

<<JavaObject[com.sun.j3d.utils.universe.SimpleUniverse] >>

universe @ getViewingPlatform[] @ setNominalViewingTransform[]

•BranchGroup

A BranchGroup for the root object is created.

LoadJavaClass["javax.media.j3d.BranchGroup"] ; root = JavaNew["javax.media.j3d.BranchGroup"]

<<JavaObject[javax.media.j3d.BranchGroup] >>

root @ setCapability[BranchGroup`ALLOWUDETACH]

TransformGroup

LoadJavaClass["javax.media.j3d.TransformGroup"] ; trans = JavaNew["javax.media.j3d.TransformGroup"]

<<JavaObject[javax.media.j3d.TransformGroup] >>

trans @ setCapability[TransformGroup`ALLOWUTRANSFORMUREAD] trans @ setCapability[TransformGroup`ALLOWUTRANSFORMUWRITE]

root @ addChild[trans]

•BoundingSphere

LoadJavaClass["javax.media.j3d.BoundingSphere"]

JavaClass[javax.media.j3d.BoundingSphere, 51]

LoadJavaClass["javax.vecmath.Point3d"]

JavaClass[javax.vecmath.Point3d, 53]

bounds = JavaNew["javax.media.j3d.BoundingSphere",  JavaNew["javax.vecmath.Point3d", 0.0, 0.0, 0.0],  100.0]

<<JavaObject[javax.media.j3d.BoundingSphere] >>

Enable object rotation by left clicked mouse.

rotator = JavaNew["com.sun.j3d.utils.behaviors.mouse.MouseRotate", trans]

<<JavaObject[com.sun.j3d.utils.behaviors.mouse.MouseRotate] >>

rotator @ setSchedulingBounds[bounds]

root @ addChild[rotator]

Enable object translation by right clicked mouse.

translator = JavaNew["com.sun.j3d.utils.behaviors.mouse.MouseTranslate", trans]

<<JavaObject[com.sun.j3d.utils.behaviors.mouse.MouseTranslate] >>

translator @ setSchedulingBounds[bounds]

root @ addChild[translator]

Enable object zoom by alt + left clicked mouse.

zoomer = JavaNew["com.sun.j3d.utils.behaviors.mouse.MouseZoom", trans]

<<JavaObject[com.sun.j3d.utils.behaviors.mouse.MouseZoom] >>

zoomer @ setSchedulingBounds[bounds]

root @ addChild[zoomer]

t3d = JavaNew["javax.media.j3d.Transform3D"]

<<JavaObject[javax.media.j3d.Transform3D] >>

t3d @ rotZ[-23.44 Degree]

trans @ setTransform[t3d]

•Rotation Transform and Interpolator

rotationTrans = JavaNew["javax.media.j3d.TransformGroup"]

<<JavaObject[javax.media.j3d.TransformGroup] >>

rotationTrans @ setCapability[TransformGroup`ALLOWUTRANSFORMUREAD] rotationTrans @ setCapability[TransformGroup`ALLOWUTRANSFORMUWRITE]

trans @ addChild[rotationTrans]

alpha = JavaNew["javax.media.j3d.Alpha", -1, 4000]

<<JavaObject[javax.media.j3d.Alpha] >>

interpolator = JavaNew["javax.media.j3d.RotationInterpolator", alpha, rotationTrans]

<<JavaObject[javax.media.j3d.RotationInterpolator] >>

interpolator @ setSchedulingBounds[bounds]

root @ addChild[interpolator]

•Texture and Appearance

texture = JavaNew["com.sun.j3d.utils.image.TextureLoader", javaImage, frame] @ getTexture[]

<<JavaObject[javax.media.j3d.Texture2D] >>

appearance = JavaNew["javax.media.j3d.Appearance"]

<<JavaObject[javax.media.j3d.Appearance] >>

appearance @ setTexture[texture]

•Sphere

sphere = JavaNew["com.sun.j3d.utils.geometry.Sphere",  0.4,  Sphere`GENERATEUTEXTUREUCOORDS,  appearance]

<<JavaObject[com.sun.j3d.utils.geometry.Sphere] >>

rotationTrans @ addChild[sphere]

•Visualize

universe @ addBranchGraph[root]


Converted by Mathematica  (August 3, 2003)