Introduction
The basic idea is to subdivide triangles and randomly move vertices up or down like this really nice diagram shows:
OK…
so maybe that looks a little confusing… but the text makes it really clear: split each triangle into 4 subtriangles. Sometimes, like
Groo , I’m a little slow of mind, so I drew a little picture to help me out:
From this, my brain part could pretty directly come up with:
t[ 0 ] = pt1, mid1, mid3
t[ 1 ] = mid1, pt2, mid2
t[ 2 ] = mid3, mid2, pt3
t[ 3 ] = mid1, mid2, mid3
Avoid the Gaps
So far so good! Split up the triangles! Raise/Lower those vertices! But…
BEWARE!
If you just start jacking around willy-nilly (or even willy+nilly [untested with willy±nilly]), you might not notice that when it’s time to split ”t[1]” and and ”t[3]” they are ”’both”’ gunna split the segment that connects ”mid1” and ”mid2”.
Lawd help you if you raise that pt in one and lower it in the other… or even raise it by different amounts: you will gap yourself up good and you
won’t like it.
It will look something like this:
and noone will think you are cool… Not even mom and dad.
My solution is pretty uncool actually:
MidPointBuddy has a
getMidPoint which returns the midpoint for any segment and keeps track of them in a hash table.
Simple, but effective… but lame.
Some minor openGL points
If you know me or if you have read any of this you probably know that I completely and shamelessly rip off everyone all the time and never do my own work.
Occassionaly I might throw together some crappy third rate ascii art:
/* p1 p2
.------------.
\` . \
\ ` . \
\ ` . \
\ ` . \
p4 .------------. p3 */
var p1 = new Pt3( -f, 0, -f );
var p2 = new Pt3( f, 0, -f );
var p3 = new Pt3( f, 0, f );
var p4 = new Pt3( -f, 0, f );
but mostly I just rip everything off from the internet and never make any sort of contributions to anything.
This is the case with the
app that drives this mess. “Borrowed” it from the
xinf gang .
Though I may have made some teensy changes.
Here is another example… I used to have some code like this a billion years ago, but I have no idea where it is now… probably on some thumb drive…
Luckily, there is no point in knowing of remembering anything anymore and with the help of
Steve Baker (who I’ve never met, but I hear is very nice), I cobbed something like
this together:
GL.shadeModel( GL.FRONT_AND_BACK );
GL.enable( GL.LIGHTING );
GL.enable( GL.COLOR_MATERIAL );
GL.colorMaterial( GL.FRONT_AND_BACK, GL.AMBIENT_AND_DIFFUSE );
GL.enable( GL.LIGHT0 );
Put that together with a
little :
e1 = p1 - p2;
e2 = p3 - p2;
normal.cross( e1, e2 ).normalize();
...
cross(e1,e2) {
this.x = ( e1.y * e2.z - e1.z * e2.y );
this.y = ( e1.z * e2.x - e1.x * e2.z );
this.z = ( e1.x * e2.y - e1.y * e2.x );
return this;
}
sprinkle in a little:
to taste and off it goes.
Go get it and run it! I’m not charging you for it!
% svn checkout http://brianin3d-triangle-mountain.googlecode.com/svn/trunk/ brianin3d-triangle-mountain-read-only
% cd brianin3d-triangle-mountain-read-only
% haxe compile.hxml
% ./app
I apologize for the controls: x,y,z,q,r
Check it out and see how easy it is to have a lot of fun with
opengl and
haxe .
Got a better idea for a project? Fire it up with
Haxe Archetype ‘s new flash tip:
Holler!
Links
the code
dhood’s blog
Haxe Archetype
opengl for Haxe
Basic OpenGL Lighting
Saddy Faces?
Sometimes things don’t work out like you’d like… I know… it’s a bummer…
XF86VidModeQueryExtension
Back when I first wrote this, this happened on my workstation, but not on my desktop:
Called from opengl/GLU.hx line 271
Called from GLFW__impl.hx line 16
Uncaught exception - load.c(232) : Failed to load library : /usr/lib/haxe/lib/opengl/0,2,0/ndll/Linux/opengl.ndll (/usr/lib/haxe/lib/opengl/0,2,0/ndll/Linux/opengl.ndll: undefined symbol: XF86VidModeQueryExtension)
they were both running Ubuntu 8.10, both with NVidia drivers… The problem ”’only”’ occurred on the workstation after some number of updates (and in 9.x) the problem magically disappeared…
osx fix
When I first ran this thing I got some junk like:
DLLLoader.hx:50: added to Env: DYLD_LIBRARY_PATH Value /usr/lib/haxe/lib/opengl/0,2,0/ndll/Mac
Called from opengl/GLU.hx line 271
Called from GLFW__impl.hx line 16
Uncaught exception - load.c(232) : Failed to load library : ./opengl.ndll (dlopen(./opengl.ndll, 1): Library not loaded: libglfw.dylib
Referenced from: /Users/brian/tmp/misc/brianin3d-triangle-mountain-read-only/opengl.ndll
Reason: image not found)
I fixed it like this: DYLD_LIBRARY_PATH=/usr/lib/haxe/lib/opengl/0,2,0/ndll/Mac:/Developer/SDKs/MacOSX10.5.sdk/usr/lib ./app
~