[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
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...