[bb] 3d Puppet Experiment by Mr Snidesmin [ 1+ years ago ]

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

Previous topic - Next topic

BlitzBot

Title : 3d Puppet Experiment
Author : Mr Snidesmin
Posted : 1+ years ago

Description : A simple puppet model that can be controlled with keyboard and mouse...  with some nicer meshes for the parts I'm sure an interesting character could be made...

Code :
Code (blitzbasic) Select
Graphics3D 800, 600, 0, 2

Type puppet
Field body
Field head
Field armL
Field armR
Field farmL
Field farmR

Field bodyYaw#
Field bodyDeltaYaw#
Field headYaw#
Field headPitch#
Field headDeltaPitch#

Field armLpitch#
Field armRpitch#

Field armLyaw#
Field armRyaw#

Field armRoll#
Field armRollTarget#

Field armYaw#
Field armYawTarget#
End Type


l = CreateLight(1)
RotateEntity l, 45,0,0

Global pup.puppet = quickpuppet()

Global mainCamera = CreateCamera()
PositionEntity mainCamera, 5, 2.5, -5
PointEntity mainCamera, pupody

;CameraClsColor mainCamera, 180, 170, 150
CameraClsColor mainCamera, 50, 70, 120

Global lookAtCamera = False

Global livemode = True

HidePointer()
While Not KeyHit(1)
If KeyHit(28) Then
livemode = Not livemode
If livemode Then
MoveMouse GraphicsWidth()/2, GraphicsHeight()/2
FlushMouse()
pupheadYaw = 0
pupheadPitch = 0
pupodyYaw = 0
HidePointer()
End If
End If

mx# = MouseXSpeed()
my# = MouseYSpeed()
mz# = MouseZSpeed()

If livemode Then
MoveMouse GraphicsWidth()/2, GraphicsHeight()/2
Else
ShowPointer()
End If

If KeyHit(59) Then puparmRollTarget = 0.0
If KeyHit(60) Then puparmRollTarget = 0.5
If KeyHit(61) Then puparmRollTarget = 1.0
If KeyHit(62) Then puparmRollTarget = 2.0

If KeyHit(63) Then puparmYawTarget = 0.0
If KeyHit(64) Then puparmYawTarget = 0.5
If KeyHit(65) Then puparmYawTarget = 1.0
If KeyHit(66) Then puparmYawTarget = 2.0

If (KeyHit(208)) Then
lookAtCamera = Not lookAtCamera
End If

If (KeyDown(200)) Then
pupheadYaw = pupheadYaw + mx
pupheadDeltaPitch = my
Else
If lookAtCamera Then
;pupheadYaw = pupheadYaw * 0.9
;pupheadPitch = pupheadPitch * 0.9
dx# = EntityX(mainCamera, True) - EntityX(puphead, True)
dy# = EntityY(mainCamera, True) - EntityY(puphead, True)
dz# = EntityZ(mainCamera, True) - EntityZ(puphead, True)

AlignToVector puphead, dx, dy, dz, 1, 0.2
pupheadYaw = EntityYaw(puphead)
pupheadPitch = EntityRoll(puphead)
End If

pupheadDeltaPitch = pupheadDeltaPitch - mz * 4
pupheadDeltaPitch = pupheadDeltaPitch * 0.8

If Not MouseDown(1) Then
puparmLpitch = puparmLpitch + my
puparmLyaw = puparmLyaw + mx
End If
If Not MouseDown(2) Then
puparmRpitch = puparmRpitch - my
puparmRyaw = puparmRyaw - mx
End If
End If

puparmRoll = puparmRoll + 0.1 * (puparmRollTarget - puparmRoll)
puparmYaw = puparmYaw + 0.1 * (puparmYawTarget - puparmYaw)


If MouseDown(1) Then
puparmLyaw = puparmLyaw * 0.9
puparmLpitch = puparmLpitch * 0.9
End If
If MouseDown(2) Then
puparmRyaw = puparmRyaw * 0.9
puparmRpitch = puparmRpitch * 0.9
End If


pupodyDeltaYaw = pupodyDeltaYaw * 0.9
pupodyDeltaYaw = pupodyDeltaYaw + 1.0 * (KeyDown(205) - KeyDown(203))
pupodyYaw = pupodyYaw + pupodyDeltaYaw
pupheadPitch = pupheadPitch - pupheadDeltaPitch

minArmPitch# = 25
maxArmPitch# = 120

minArmYaw# = 0
maxArmYaw# = 100

;Limits
If (puparmLPitch < -maxArmPitch) puparmLPitch = -maxArmPitch
If (puparmRPitch > maxArmPitch) puparmRPitch = maxArmPitch
If (puparmLPitch > minArmPitch) puparmLPitch = minArmPitch
If (puparmRPitch < -minArmPitch) puparmRPitch = -minArmPitch

If (puparmLYaw < -maxArmYaw) puparmLYaw = -maxArmYaw
If (puparmRYaw > maxArmYaw) puparmRYaw = maxArmYaw
If (puparmLYaw > minArmYaw) puparmLYaw = minArmYaw
If (puparmRYaw < -minArmYaw) puparmRYaw = -minArmYaw

;limit to make sure arms do not cross
;EntityColor pupfarmL, 255, 255, 255
;EntityColor pupfarmR, 255, 255, 255

critArmYaw# = 85
If (puparmRYaw > critArmYaw And puparmLYaw < -critArmYaw) Then
dPitch# = puparmRPitch + puparmLPitch
If Abs(dPitch) < 20 Then
;EntityColor pupfarmL, 255, 50, 50
;EntityColor pupfarmR, 255, 50, 50

If (dPitch < 0) Then
puparmRPitch = puparmRPitch - 0.5
puparmLPitch = puparmLPitch - 0.5

puparmRYaw = puparmRYaw - 0.5
puparmLYaw = puparmLYaw - 0.5
Else
puparmRPitch = puparmRPitch + 0.5
puparmLPitch = puparmLPitch + 0.5

puparmRYaw = puparmRYaw + 0.5
puparmLYaw = puparmLYaw + 0.5
End If
End If
End If

maxHeadYaw# = 80
maxHeadPitch# = 50
minHeadPitch# = 30

If (pupheadYaw < -maxHeadYaw) pupheadYaw = -maxHeadYaw
If (pupheadYaw > maxHeadYaw) pupheadYaw = maxHeadYaw

If (pupheadPitch < -minHeadPitch) pupheadPitch = -minHeadPitch
If (pupheadPitch > maxHeadPitch) pupheadPitch = maxHeadPitch


RotateEntity pupody, 0, pupodyYaw, 0
RotateEntity puphead, 0, pupheadYaw, pupheadPitch
RotateEntity puparmL, puparmLPitch, puparmLyaw+40, -puparmLyaw * puparmRoll
RotateEntity puparmR, puparmRPitch, puparmRyaw-40, puparmRyaw * puparmRoll
RotateEntity pupfarmL, puparmLPitch, puparmLyaw*puparmYaw+20, 0
RotateEntity pupfarmR, puparmRPitch, puparmRyaw*puparmYaw-20, 0

SetBuffer BackBuffer()
RenderWorld()
Color 255,100,0
y = GraphicsHeight() - 160
x = 10
dy = 16
Text x, y+0*dy, "F1-F4: Set arm roll extent"
Text x, y+1*dy, "F5-F8: Set arm yaw extent"
If (KeyDown(200)) Then
Text x, y+2*dy, "Mouse X/Y: Look around"
Else
Text x, y+2*dy, "Mouse X/Y: Move Arms"
End If
Text x, y+3*dy, "Mouse Wheel: Look up/down"
Text x, y+4*dy, "Mouse LB: Relax Left Arm"
Text x, y+5*dy, "Mouse RB: Relax Right Arm"
Text x, y+6*dy, "Left+Right Arrows: Rotate"
Text x, y+7*dy, "Down Arrow: Look at camera"
Text x, y+8*dy, "Up Arrow: Switch to look mode"

Flip
Wend
End


Function quickpuppet.puppet()
p.puppet = New puppet
pody = CreateCube()
phead = CreateSphere(8, pody)

ScaleMesh pody, 0.5, 1.4, 1
ScaleMesh phead, 0.8, 1, 0.7
PositionMesh phead, 0, 0.3, 0

eye1 = CreateSphere(4, phead)
ScaleEntity eye1, 0.3, 0.3, 0.3
PositionEntity eye1, 0.55,0.3,-0.3
eye2 = CreateSphere(4, phead)
ScaleEntity eye2, 0.3, 0.3, 0.3
PositionEntity eye2, 0.55,0.3,0.3
PositionEntity phead, 0,2,0

parmL = CreateCylinder(6, True, pody)
RotateMesh parmL, 90,0,0
FitMesh parmL, -0.3, -0.3, 0, 0.6, 0.6, 2.0
RotateMesh parmL, 45,0,0
PositionEntity parmL, 0, 1, 1

parmR = CopyMesh(parmL, pody)
RotateMesh parmR, 0, 180, 0
PositionEntity parmR, 0, 1, -1

pfarmL = CopyMesh(parmL, parmL)
PositionEntity pfarmL, 0, -1.5, 1.5
RotateMesh pfarmL, 20, 0, 30

pfarmR = CopyMesh(parmR, parmR)
PositionEntity pfarmR, 0, -1.5, -1.5
RotateMesh pfarmR, -20, 10, 30

parmRollTarget = 0.5
parmYawTarget = 1.0

Return p
End Function


Comments : none...