Code archives/3D Graphics - Misc/3d Puppet Experiment

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

Download source code

3d Puppet Experiment by Mr Snidesmin2010
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...
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, pup\body

;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()
			pup\headYaw = 0
			pup\headPitch = 0
			pup\bodyYaw = 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 pup\armRollTarget = 0.0
	If KeyHit(60) Then pup\armRollTarget = 0.5
	If KeyHit(61) Then pup\armRollTarget = 1.0
	If KeyHit(62) Then pup\armRollTarget = 2.0
	
	If KeyHit(63) Then pup\armYawTarget = 0.0
	If KeyHit(64) Then pup\armYawTarget = 0.5
	If KeyHit(65) Then pup\armYawTarget = 1.0
	If KeyHit(66) Then pup\armYawTarget = 2.0
	
	If (KeyHit(208)) Then
		lookAtCamera = Not lookAtCamera 
	End If
	
	If (KeyDown(200)) Then
		pup\headYaw = pup\headYaw + mx
		pup\headDeltaPitch = my
	Else
		If lookAtCamera Then
			;pup\headYaw = pup\headYaw * 0.9
			;pup\headPitch = pup\headPitch * 0.9
			dx# = EntityX(mainCamera, True) - EntityX(pup\head, True)
			dy# = EntityY(mainCamera, True) - EntityY(pup\head, True)
			dz# = EntityZ(mainCamera, True) - EntityZ(pup\head, True)
			
			AlignToVector pup\head, dx, dy, dz, 1, 0.2
			pup\headYaw = EntityYaw(pup\head)
			pup\headPitch = EntityRoll(pup\head)
		End If
		
		pup\headDeltaPitch = pup\headDeltaPitch - mz * 4
		pup\headDeltaPitch = pup\headDeltaPitch * 0.8
		
		If Not MouseDown(1) Then
			pup\armLpitch = pup\armLpitch + my
			pup\armLyaw = pup\armLyaw + mx 
		End If
		If Not MouseDown(2) Then
			pup\armRpitch = pup\armRpitch - my
			pup\armRyaw = pup\armRyaw - mx
		End If
	End If
	
	pup\armRoll = pup\armRoll + 0.1 * (pup\armRollTarget - pup\armRoll)
	pup\armYaw = pup\armYaw + 0.1 * (pup\armYawTarget - pup\armYaw)

	
	If MouseDown(1) Then
		pup\armLyaw = pup\armLyaw * 0.9
		pup\armLpitch = pup\armLpitch * 0.9
	End If
	If MouseDown(2) Then
		pup\armRyaw = pup\armRyaw * 0.9
		pup\armRpitch = pup\armRpitch * 0.9	
	End If


	pup\bodyDeltaYaw = pup\bodyDeltaYaw * 0.9
	pup\bodyDeltaYaw = pup\bodyDeltaYaw + 1.0 * (KeyDown(205) - KeyDown(203))
	pup\bodyYaw = pup\bodyYaw + pup\bodyDeltaYaw
	pup\headPitch = pup\headPitch - pup\headDeltaPitch
	
	minArmPitch# = 25
	maxArmPitch# = 120
	
	minArmYaw# = 0
	maxArmYaw# = 100
	
	;Limits
	If (pup\armLPitch < -maxArmPitch) pup\armLPitch = -maxArmPitch
	If (pup\armRPitch > maxArmPitch) pup\armRPitch = maxArmPitch
	If (pup\armLPitch > minArmPitch) pup\armLPitch = minArmPitch
	If (pup\armRPitch < -minArmPitch) pup\armRPitch = -minArmPitch
		
	If (pup\armLYaw < -maxArmYaw) pup\armLYaw = -maxArmYaw
	If (pup\armRYaw > maxArmYaw) pup\armRYaw = maxArmYaw
	If (pup\armLYaw > minArmYaw) pup\armLYaw = minArmYaw
	If (pup\armRYaw < -minArmYaw) pup\armRYaw = -minArmYaw
	
	;limit to make sure arms do not cross
	;EntityColor pup\farmL, 255, 255, 255
	;EntityColor pup\farmR, 255, 255, 255
	
	critArmYaw# = 85
	If (pup\armRYaw > critArmYaw And pup\armLYaw < -critArmYaw) Then
		dPitch# = pup\armRPitch + pup\armLPitch
		If Abs(dPitch) < 20 Then
			;EntityColor pup\farmL, 255, 50, 50
			;EntityColor pup\farmR, 255, 50, 50
			
			If (dPitch < 0) Then
				pup\armRPitch = pup\armRPitch - 0.5
				pup\armLPitch = pup\armLPitch - 0.5
				
				pup\armRYaw = pup\armRYaw - 0.5
				pup\armLYaw = pup\armLYaw - 0.5
			Else
				pup\armRPitch = pup\armRPitch + 0.5
				pup\armLPitch = pup\armLPitch + 0.5
				
				pup\armRYaw = pup\armRYaw + 0.5
				pup\armLYaw = pup\armLYaw + 0.5
			End If
		End If 
	End If
	
	maxHeadYaw# = 80
	maxHeadPitch# = 50
	minHeadPitch# = 30
		
	If (pup\headYaw < -maxHeadYaw) pup\headYaw = -maxHeadYaw
	If (pup\headYaw > maxHeadYaw) pup\headYaw = maxHeadYaw
	
	If (pup\headPitch < -minHeadPitch) pup\headPitch = -minHeadPitch
	If (pup\headPitch > maxHeadPitch) pup\headPitch = maxHeadPitch
	
	
	RotateEntity pup\body, 0, pup\bodyYaw, 0
	RotateEntity pup\head, 0, pup\headYaw, pup\headPitch
	RotateEntity pup\armL, pup\armLPitch, pup\armLyaw+40, -pup\armLyaw * pup\armRoll
	RotateEntity pup\armR, pup\armRPitch, pup\armRyaw-40, pup\armRyaw * pup\armRoll
	RotateEntity pup\farmL, pup\armLPitch, pup\armLyaw*pup\armYaw+20, 0
	RotateEntity pup\farmR, pup\armRPitch, pup\armRyaw*pup\armYaw-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
	p\body = CreateCube()
	p\head = CreateSphere(8, p\body)
	
	ScaleMesh p\body, 0.5, 1.4, 1
	ScaleMesh p\head, 0.8, 1, 0.7
	PositionMesh p\head, 0, 0.3, 0
	
	eye1 = CreateSphere(4, p\head)
	ScaleEntity eye1, 0.3, 0.3, 0.3
	PositionEntity eye1, 0.55,0.3,-0.3
	eye2 = CreateSphere(4, p\head)
	ScaleEntity eye2, 0.3, 0.3, 0.3
	PositionEntity eye2, 0.55,0.3,0.3
	PositionEntity p\head, 0,2,0
	
	p\armL = CreateCylinder(6, True, p\body)
	RotateMesh p\armL, 90,0,0
	FitMesh p\armL, -0.3, -0.3, 0, 0.6, 0.6, 2.0
	RotateMesh p\armL, 45,0,0
	PositionEntity p\armL, 0, 1, 1
		
	p\armR = CopyMesh(p\armL, p\body)
	RotateMesh p\armR, 0, 180, 0
	PositionEntity p\armR, 0, 1, -1
		
	p\farmL = CopyMesh(p\armL, p\armL)
	PositionEntity p\farmL, 0, -1.5, 1.5
	RotateMesh p\farmL, 20, 0, 30
	
	p\farmR = CopyMesh(p\armR, p\armR)
	PositionEntity p\farmR, 0, -1.5, -1.5
	RotateMesh p\farmR, -20, 10, 30
	
	p\armRollTarget = 0.5
	p\armYawTarget = 1.0
	
	Return p
End Function

Comments

None.

Code Archives Forum