Code archives/3D Graphics - Mesh/Outlines

This code has been declared by its author to be Public Domain code.

Download source code

Outlines by jfk EO-111102003
This example is using the simple Method of a flipped black Copy of the original Mesh to achieve black Outlines. Unlike other Demos this one scales the outter Mesh continoulsy based on their Distance to the Camera. The Result are Outlines which have always the same thickness, no matter if they are near or far. This is looking much more authentic like a Comic Drawing that was outlined using a Ink-Pen or -Feather.

You also might have to multiply the outline scaling values by the Mesh sizes when you have diffrent Mesh Sizes. The goal is to get the same outlines for everything.
Graphics3D 640,480,16,2
SetBuffer BackBuffer()

camera=CreateCamera()
MoveEntity camera,0,0,-3
CameraRange camera,1,2000
CameraClsColor camera,20,50,100
light=CreateLight()
RotateEntity light,30,30,30

n=200
Dim cubei(n),cubeo(n),sx#(n),sy#(n),sz#(n),x#(n),y#(n),z#(n)

min100=-30
max100=30
For i=0 To n
 cubei(i)=CreateSphere(7)
 EntityFX cubei(i),8 Or 4
 cubeo(i)=CreateSphere(7,cubei(i))
 EntityFX cubeo(i),1
 FlipMesh cubeo(i)
 EntityColor cubeo(i),0,0,0
 x(i)=Rnd(min100,max100)
 y(i)=Rnd(min100,max100)
 z(i)=Rnd(max100)
 sx(i)=Rnd(.1,.2)
 sy(i)=Rnd(.1,.2)
 sz(i)=Rnd(.1,.2)
 EntityColor cubei(i),Rand(20,255),Rand(20,255),Rand(20,255)
Next

correct=1
While KeyDown(1)=0
 If KeyHit(57)
  correct=correct Xor 1
 EndIf

 For i=0 To n
  x(i)=x(i)+sx(i)
  If x(i)>max100 Then sx(i)=-Rnd(.1,.2)
  If x(i)<min100 Then sx(i)=Rnd(.1,.2)  

  y(i)=y(i)+sy(i)
  If y(i)>max100 Then sy(i)=-Rnd(.1,.2)
  If y(i)<min100 Then sy(i)=Rnd(.1,.2)

  z(i)=z(i)+sz(i)
  If z(i)>max100 Then sz(i)=-Rnd(.1,.2)
  If z(i)<1 Then sz(i)=Rnd(.1,.2)

  PositionEntity cubei(i),x(i),y(i),z(i),1

  TurnEntity cubei(i),1,1,1
  ; d#=EntityDistance(camera,cubei(i)) ; for a mobile camera
  d#=Abs(EntityZ(camera)-EntityZ(cubei(i))) ; pretty accureate, but only for a north-pointing camera
  s#=1.01+(d/80.0)
  If s>2 Then s=2
  If correct=1
   ScaleEntity cubeo(i),s,s,s
  Else
   ScaleEntity cubeo(i),1.2,1.2,1.2
  EndIf
 Next

 RenderWorld()
 Text 0,0,"Hit Space to toggle Scaling Correcture"
 If correct
  Text 0,16,"Correcture is on"
 Else
  Text 0,16,"Correcture is off"
 EndIf
 Flip
Wend
End

Comments

Baystep Productions2005
If only it was a single function..... hmmmm.... that gives me an idea....


Code Archives Forum