[bb] Bezier Interpolation in 3D by Markus Rauch [ 1+ years ago ]

Started by BlitzBot, June 29, 2017, 00:28:40

Previous topic - Next topic

BlitzBot

Title : Bezier Interpolation in 3D
Author : Markus Rauch
Posted : 1+ years ago

Description : Bezier Interpolation in 3D

Code :
Code (blitzbasic) Select
;Bezier Interpolation BlitzBasic 3D Example from Markus Rauch

;MR 14.04.2003

;--------------------------------------------------------

Graphics3D 800,600,16,0
SetBuffer BackBuffer()

AppTitle " Bezier Interpolation BlitzBasic 3D Example from Markus Rauch"

;--------------------------------------------------------

Global camp=CreatePivot()
Global cam=CreateCamera(camp)
CameraZoom cam,1
CameraRange cam,1,10000

PositionEntity camp,0,0,-200

;--------------------------------------------------------

Type Vector3D
 Field x#,y#,z#
 Field Pitch#
 Field Yaw#
 Field Roll#
End Type

Dim ve.Vector3D(100)

ve.Vector3D(0)=New Vector3D
ve.Vector3D(1)=New Vector3D
ve.Vector3D(2)=New Vector3D
ve.Vector3D(3)=New Vector3D

Global VectorMax=4

Global p.Vector3D=New Vector3D

ve(0)x=-50
ve(0)y=50
ve(0)z=0

ve(1)x=-25
ve(1)y=0
ve(1)z=0

ve(2)x=25
ve(2)y=50
ve(2)z=0

ve(3)x=0 ;Moving
ve(3)y=0
ve(3)z=0

While Not KeyHit(1)

 RenderWorld

 ;-------------------- Moving Point (3)

 Local w#

 ve(3)x=50+Sin(w)*100
 ve(3)y= 0+Cos(w)*100

 w#=w#+1 :If w>360.0 Then w=w-360.0

 ;--------------------

 Color 255,255,0

 Local mu#
 Local st#=0.01

 mu=0.0
 Repeat

  Bezier4 p,ve(0),ve(1),ve(2),ve(3),mu ;Only 4 Points

  ;Bezier p,mu  ;All Points

  Plot3D p

  mu=mu+st
  If mu>1.0 Then Exit
 Forever

 ;Show all Points
 For v=0 To VectorMax-1
  Color 128,128,128
  Text3D ve(v),"V "+V
  Color 255,0,0
  Plot3D ve(v)
 Next

 Flip
Wend
End

;##########################################################################

Function Bezier3(p.Vector3D,p1.Vector3D,p2.Vector3D,p3.Vector3D,mu#)

 ;MR 13.04.2003

 ;Three control point Bezier interpolation
 ;mu ranges from 0 To 1, start To End of curve

  Local mum1#,mum12#,mu2#

  mu2 = mu * mu
  mum1 = 1 - mu
  mum12 = mum1 * mum1

  px = p1x * mum12 + 2 * p2x * mum1 * mu + p3x * mu2
  py = p1y * mum12 + 2 * p2y * mum1 * mu + p3y * mu2
  pz = p1z * mum12 + 2 * p2z * mum1 * mu + p3z * mu2

End Function

Function Bezier4(p.Vector3D,p1.Vector3D,p2.Vector3D,p3.Vector3D,p4.Vector3D,mu#)

 ;MR 13.04.2003

 ;Four control point Bezier interpolation
 ;mu ranges from 0 To 1, start To End of curve

 Local mum1#,mum13#,mu3#

 mum1 = 1.0 - mu
 mum13 = mum1 * mum1 * mum1
 mu3 = mu * mu * mu

 px = mum13*p1x + 3.0*mu*mum1*mum1*p2x + 3.0*mu*mu*mum1*p3x + mu3*p4x
 py = mum13*p1y + 3.0*mu*mum1*mum1*p2y + 3.0*mu*mu*mum1*p3y + mu3*p4y
 pz = mum13*p1z + 3.0*mu*mum1*mum1*p2z + 3.0*mu*mu*mum1*p3z + mu3*p4z

End Function

;##########################################################################

Function Bezier(p.Vector3D,mu#)

 ;MR 14.04.2003

 ;General Bezier curve
 ;Number of control points is n+1
 ;mu 0 bis 1    IMPORTANT, the Last point is Not computed

 Local k,kn,nn,nkn
 Local blend#,muk#,munk#

 Local px#,py#,pz#

 Local n=VectorMax-1

   px=0.0
   py=0.0
   pz=0.0
 
   muk = 1.0
   munk = pow(1.0-mu,Float(n))

   For k=0 To n
      nn = n
      kn = k
      nkn = n - k
      blend = muk * munk
      muk =muk * mu
      munk = munk / (1.0-mu)
      While nn => 1
         blend=blend * nn
         nn=nn-1
         If kn > 1 Then
            blend=blend / Float(kn)
            kn=kn-1
         EndIf
         If nkn > 1 Then
            blend=blend / Float(nkn)
           nkn=nkn-1
         EndIf
      Wend
      px=px+ve(k)x * blend
      py=py+ve(k)y * blend
      pz=pz+ve(k)z * blend
   Next
 
End Function

;##########################################################################

Function pow#(a#,b#)

 ;MR 14.04.2003

 ;C Like :-)

 Return a^b

End Function

;##########################################################################

Function Plot3D(p.Vector3D)

 ;MR 14.04.2003

 ;cam ist Global und das Handle der Camera

 Local x,y

 CameraProject cam,px,py,pz
 x=ProjectedX()
 y=ProjectedY()

 Plot x,y

End Function

;##########################################################################

Function Text3D(p.Vector3D,t$)

 ;MR 14.04.2003

 ;cam ist Global und das Handle der Camera

 Local x,y

 CameraProject cam,px,py,pz
 x=ProjectedX()
 y=ProjectedY()

 Text x,y,t$,True,True

End Function

;##########################################################################

Function CubicInterpolate#(y0#,y1#,y2#,y3#,mu#)

 ;MR 13.04.2003

 Local a0#,a1#,a2#,a3#,mu2#

 mu2 = mu*mu
 a0 = y3 - y2 - y0 + y1
 a1 = y0 - y1 - a0
 a2 = y2 - y0
 a3 = y1

 Return (a0*mu*mu2+a1*mu2+a2*mu+a3)

End Function

;##########################################################################


Comments :


Uncle(Posted 1+ years ago)

 I needed a blitzmax version using minib3d, so here it is if anyone else needs it...
SuperStrict
Import "minib3d.bmx"

Graphics3D 800,600,16,0

AppTitle = " Bezier Interpolation BlitzMax Example"

'--------------------------------------------------------

Global camp:tpivot = CreatePivot()
Global cam:tcamera = CreateCamera(camp)
PositionEntity camp, 0, 0, - 200

'--------------------------------------------------------

Type Vector3D
Field x:Float
Field y:Float
Field z:Float
  Field Pitch:Float
  Field Yaw:Float
  Field Roll:Float
End Type

Type VectorLine
Field startNode:Vector3D = New Vector3D
Field endNode:Vector3D = New Vector3D
Field modifierNode1:Vector3D = New Vector3D
Field modifierNode2:Vector3D = New Vector3D

Method setStartNode(inX:Float, inY:Float, inZ:Float)
startNode.x = inX
startNode.y = inY
startNode.z = inZ
End Method

Method setEndNode(inX:Float, inY:Float, inZ:Float)
endNode.x = inX
endNode.y = inY
endNode.z = inZ
End Method

Method setModifierNode(inX:Float, inY:Float, inZ:Float, inNode:Int)
Select inNode
Case 1
modifierNode1.x = inX
modifierNode1.y = inY
modifierNode1.z = inZ
Case 2
modifierNode2.x = inX
modifierNode2.y = inY
modifierNode2.z = inZ
End Select
End Method

Method plotModifierNode(inNode:Int)
Select inNode
Case 1
SetColor 255, 255, 0
Plot3D(modifierNode1, 2)
Text3D(modifierNode1, "M1")
Case 2
SetColor 255, 255, 0
Plot3D(modifierNode2, 2)
Text3D(modifierNode2, "M2")
End Select
End Method

Method plotStartNode()
SetColor 0, 255, 0
Plot3D(startNode, 2)
Text3D(startNode, "S")
End Method

Method plotEndNode()
SetColor 255, 0, 0
Plot3D(endNode, 2)
Text3D(endNode, "E")
End Method

Method plotLine()
SetColor 155, 155, 155
Local mu:Float
Local st:Float = 0.01

mu = 0.0
Repeat
Bezier4 (p, vl.startNode, vl.modifierNode1, vl.modifierNode2, vl.endNode, mu) 'Only 4 Points
  Plot3D p, 2

  mu = mu + st
  If mu > 1.0 Then Exit
Forever
End Method

Method plotPointOnLine(mu:Float)
SetColor 0, 255, 255
Bezier4 (p, vl.startNode, vl.modifierNode1, vl.modifierNode2, vl.endNode, mu) 'Only 4 Points
  Plot3D p, 5
End Method

End Type


Const VECTORMAX:Int = 4
Global vl:VectorLine = New VectorLine
Global p:Vector3D = New Vector3D
Global pointOnLine:Float = 0.5

vl.setStartNode(- 50, 50, 0)
vl.setEndNode(- 25, 0, 0)
vl.setModifierNode(25, 50, 0, 1)
vl.setModifierNode(0, 0, 0, 2)


While Not KeyHit(KEY_ESCAPE)
RenderWorld

If KeyDown(KEY_UP) And pointOnLine < 1 Then pointOnLine:+0.01
If KeyDown(KEY_DOWN) And pointOnLine > 0 Then pointOnLine:-0.01

If KeyHit(KEY_SPACE) Then
vl.setModifierNode(Rand(- 125, 125), Rand(- 125, 125), 0, 1)
vl.setModifierNode(Rand(- 125, 125), Rand(- 125, 125), 0, 2)
End If

beginmax2d()
  '-------------------- Moving Point (3)

Global w:Float

vl.endNode.x = 50 + Sin(w) * 100
vl.endNode.y = 0 + Cos(w) * 100

w:Float = w:Float + 1
If w>360.0 Then w=w-360.0

'--------------------
vl.plotModifierNode(1)
vl.plotModifierNode(2)
vl.plotStartNode()
vl.plotEndNode()
vl.plotLine()
vl.plotPointOnLine(pointOnLine)

SetColor 255, 255, 255
DrawText "Use the up and down keys to move the along the line.", 10, 10
DrawText "Press space to randomise the position of the modifiers", 10, 25
endmax2d()
  Flip 1
Wend

End

'##########################################################################

Function Bezier3(p:Vector3D, p1:Vector3D, p2:Vector3D, p3:Vector3D, mu:Float)

'MR 13.04.2003

'Three control point Bezier interpolation
'mu ranges from 0 To 1, start To End of curve

Local mum1:Float, mum12:Float, mu2:Float

mu2 = mu * mu
mum1 = 1 - mu
mum12 = mum1 * mum1

p.x = p1.x * mum12 + 2 * p2.x * mum1 * mu + p3.x * mu2
p.y = p1.y * mum12 + 2 * p2.y * mum1 * mu + p3.y * mu2
p.z = p1.z * mum12 + 2 * p2.z * mum1 * mu + p3.z * mu2

End Function

Function Bezier4(p:Vector3D, p1:Vector3D, p2:Vector3D, p3:Vector3D, p4:Vector3D, mu:Float)

'MR 13.04.2003

'Four control point Bezier interpolation
'mu ranges from 0 To 1, start To End of curve

Local mum1:Float, mum13:Float, mu3:Float

mum1 = 1.0 - mu
mum13 = mum1 * mum1 * mum1
mu3 = mu * mu * mu

p.x = mum13 * p1.x + 3.0 * mu * mum1 * mum1 * p2.x + 3.0 * mu * mu * mum1 * p3.x + mu3 * p4.x
p.y = mum13 * p1.y + 3.0 * mu * mum1 * mum1 * p2.y + 3.0 * mu * mu * mum1 * p3.y + mu3 * p4.y
p.z = mum13 * p1.z + 3.0 * mu * mum1 * mum1 * p2.z + 3.0 * mu * mu * mum1 * p3.z + mu3 * p4.z

End Function

'##########################################################################

Function Bezier(p:Vector3D, mu:Float)

'MR 14.04.2003

'General Bezier curve
'Number of control points is n+1
'mu 0 bis 1    IMPORTANT, the Last point is Not computed

Local k:Int, kn:Float, nn:Float, nkn:Float
Local blend:Float, muk:Float, munk:Float

Local px:Float, py:Float, pz:Float

Local n:Int = VECTORMAX - 1

p.x = 0.0
p.y = 0.0
p.z = 0.0

muk = 1.0
munk = pow(1.0 - mu, Float(n))

For k = 0 To n
nn = n
   kn = k
   nkn = n - k
   blend = muk * munk
   muk = muk * mu
   munk = munk / (1.0 - mu)
   While nn >= 1
    blend = blend * nn
       nn = nn - 1
       If kn > 1 Then
        blend = blend / Float(kn)
           kn=kn-1
       EndIf
       If nkn > 1 Then
        blend = blend / Float(nkn)
          nkn = nkn - 1
       EndIf
Wend
Select k
Case 0
p.x = p.x + vl.startNode.x * blend
      p.y = p.y + vl.startNode.y * blend
      p.z = p.z + vl.startNode.z * blend
Case 1
p.x = p.x + vl.endNode.x * blend
      p.y = p.y + vl.endNode.y * blend
      p.z = p.z + vl.endNode.z * blend
Case 2
p.x = p.x + vl.modifierNode1.x * blend
      p.y = p.y + vl.modifierNode1.y * blend
      p.z = p.z + vl.modifierNode1.z * blend
Case 0
p.x = p.x + vl.modifierNode2.x * blend
      p.y = p.y + vl.modifierNode2.y * blend
      p.z = p.z + vl.modifierNode2.z * blend
End Select
Next
 
End Function

'##########################################################################

Function pow#(a#,b#)

'MR 14.04.2003

'C Like :-)

Return a^b

End Function

'##########################################################################

Function Plot3D(p:Vector3D, Size:Int)

'MR 14.04.2003

'cam ist Global und das Handle der Camera

Local x:Float, y:Float

CameraProject cam, p.x, p.y, p.z
x=ProjectedX()
y=ProjectedY()

DrawRect x, y, Size, Size

End Function

'##########################################################################

Function Text3D(p:Vector3D, t:String)

'MR 14.04.2003

'cam ist Global und das Handle der Camera

Local x:Float, y:Float

CameraProject cam, p.x, p.y, p.z
x=ProjectedX()
y=ProjectedY()

DrawText t, x, y

End Function

'##########################################################################

Function CubicInterpolate#(y0#,y1#,y2#,y3#,mu#)

'MR 13.04.2003

Local a0#,a1#,a2#,a3#,mu2#

mu2 = mu*mu
a0 = y3 - y2 - y0 + y1
a1 = y0 - y1 - a0
a2 = y2 - y0
a3 = y1

Return (a0 * mu * mu2 + a1 * mu2 + a2 * mu + a3)

End Function

'##########################################################################