Browse Source

3D Physics and Other Stuff
-=-=-=-=-=-=-=-=-=-=-=-=-=

-New Vehicle (Based on Bullet's RaycastVehicle) - Vehiclebody/VehicleWheel. Demo will come soon, old vehicle (CarBody) will go away soon too.
-A lot of fixes to the 3D physics engine
-Added KinematicBody with demo
-Fixed the space query API for 2D (demo will come soon). 3D is WIP.
-Fixed long-standing bug with body_enter/body_exit for Area and Area2D
-Performance variables now includes physics (active bodies, collision pairs and islands)
-Ability to see what's inside of instanced scenes!
-Fixed Blend Shapes (no bs+skeleton yet)
-Added an Android JavaClassWrapper singleton for using Android native classes directly from GDScript. This is very Alpha!

Juan Linietsky 11 years ago
parent
commit
de311d7f95

File diff suppressed because it is too large
+ 12 - 9
2d/platformer/stage.xml


BIN
3d/kinematic_char/cubelib.res


+ 96 - 0
3d/kinematic_char/cubio.gd

@@ -0,0 +1,96 @@
+
+extends KinematicBody
+
+# member variables here, example:
+# var a=2
+# var b="textvar"
+
+var g = -9.8
+var vel = Vector3()
+const MAX_SPEED = 5
+const JUMP_SPEED = 7
+const ACCEL= 2
+const DEACCEL= 4
+const MAX_SLOPE_ANGLE = 30
+
+func _fixed_process(delta):
+
+	var dir = Vector3() #where does the player intend to walk to
+	var cam_xform = get_node("target/camera").get_global_transform()
+	
+	if (Input.is_action_pressed("move_forward")):
+		dir+=-cam_xform.basis[2] 
+	if (Input.is_action_pressed("move_backwards")):
+		dir+=cam_xform.basis[2] 
+	if (Input.is_action_pressed("move_left")):
+		dir+=-cam_xform.basis[0] 
+	if (Input.is_action_pressed("move_right")):
+		dir+=cam_xform.basis[0] 
+
+	dir.y=0
+	dir=dir.normalized()
+
+	vel.y+=delta*g
+	
+	var hvel = vel
+	hvel.y=0	
+	
+	var target = dir*MAX_SPEED
+	var accel
+	if (dir.dot(hvel) >0):
+		accel=ACCEL
+	else:
+		accel=DEACCEL
+		
+	hvel = hvel.linear_interpolate(target,accel*delta)
+	
+	vel.x=hvel.x;
+	vel.z=hvel.z	
+		
+	var motion = vel*delta
+	motion=move(vel*delta)
+
+	var on_floor = false
+	var original_vel = vel
+
+
+	var floor_velocity=Vector2()
+
+	var attempts=4
+	
+	while(is_colliding() and attempts):
+		var n=get_collision_normal()
+
+		if ( rad2deg(acos(n.dot( Vector3(0,1,0)))) < MAX_SLOPE_ANGLE ):
+				#if angle to the "up" vectors is < angle tolerance
+				#char is on floor
+				floor_velocity=get_collider_velocity()
+				on_floor=true			
+			
+		motion = n.slide(motion)
+		vel = n.slide(vel)
+		if (original_vel.dot(vel) > 0):
+			#do not allow to slide towads the opposite direction we were coming from
+			motion=move(motion)
+			if (motion.length()<0.001):
+				break
+		attempts-=1
+
+	if (on_floor and floor_velocity!=Vector3()):
+			move(floor_velocity*delta)
+	
+	if (on_floor and Input.is_action_pressed("jump")):
+		vel.y=JUMP_SPEED
+		
+	var crid = get_node("../elevator1").get_rid()
+#	print(crid," : ",PS.body_get_state(crid,PS.BODY_STATE_TRANSFORM))
+
+func _ready():
+	# Initalization here
+	set_fixed_process(true)
+	pass
+
+
+func _on_tcube_body_enter( body ):
+	get_node("../ty").show()
+	pass # replace with function body

+ 17 - 0
3d/kinematic_char/engine.cfg

@@ -0,0 +1,17 @@
+[application]
+
+name="Kinematic Character 3D"
+main_scene="res://level.scn"
+icon="res://kinebody3d.png"
+
+[input]
+
+move_forward=[key(Up)]
+move_left=[key(Left)]
+move_right=[key(Right)]
+move_backwards=[key(Down)]
+jump=[key(Space)]
+
+[rasterizer]
+
+shadow_filter=3

+ 92 - 0
3d/kinematic_char/follow_camera.gd

@@ -0,0 +1,92 @@
+
+extends Camera
+
+# member variables here, example:
+# var a=2
+# var b="textvar"
+
+var collision_exception=[]
+export var min_distance=0.5
+export var max_distance=4.0
+export var angle_v_adjust=0.0
+export var autoturn_ray_aperture=25
+export var autoturn_speed=50
+var max_height = 2.0
+var min_height = 0
+
+func _fixed_process(dt):
+	var target  = get_parent().get_global_transform().origin
+	var pos = get_global_transform().origin
+	var up = Vector3(0,1,0)
+	
+	var delta = pos - target
+	
+	#regular delta follow
+	
+	#check ranges
+	
+	if (delta.length() < min_distance):
+		delta = delta.normalized() * min_distance
+	elif (delta.length() > max_distance):
+		delta = delta.normalized() * max_distance
+	
+	#check upper and lower height
+	if ( delta.y > max_height):
+		delta.y = max_height
+	if ( delta.y < min_height):
+		delta.y = min_height
+		
+	#check autoturn
+	
+	var ds = PhysicsServer.space_get_direct_state( get_world().get_space() )
+	
+	
+	var col_left = ds.intersect_ray(target,target+Matrix3(up,deg2rad(autoturn_ray_aperture)).xform(delta),collision_exception)
+	var col = ds.intersect_ray(target,target,collision_exception)
+	var col_right = ds.intersect_ray(target,target+Matrix3(up,deg2rad(-autoturn_ray_aperture)).xform(delta),collision_exception)
+	
+	if (col!=null):
+		#if main ray was occluded, get camera closer, this is the worst case scenario
+		delta = col.position - target	
+	elif (col_left!=null and col_right==null):
+		#if only left ray is occluded, turn the camera around to the right
+		delta = Matrix3(up,deg2rad(-dt*autoturn_speed)).xform(delta)
+	elif (col_left==null and col_right!=null):
+		#if only right ray is occluded, turn the camera around to the left
+		delta = Matrix3(up,deg2rad(dt*autoturn_speed)).xform(delta)
+	else:
+		#do nothing otherwise, left and right are occluded but center is not, so do not autoturn
+		pass
+	
+	#apply lookat
+	pos = target + delta
+	
+	look_at_from_pos(pos,target,up)
+	
+	#turn a little up or down
+	var t = get_transform()
+	t.basis = Matrix3(t.basis[0],deg2rad(angle_v_adjust)) * t.basis
+	set_transform(t)
+	
+	
+
+func _ready():
+
+#find collision exceptions for ray
+	var node = self
+	while(node):
+		if (node extends RigidBody):
+			collision_exception.append(node.get_rid())
+			break
+		else:
+			node=node.get_parent()
+	# Initalization here
+	set_fixed_process(true)
+	#this detaches the camera transform from the parent spatial node
+	set_as_toplevel(true)
+
+	
+	
+
+
+

BIN
3d/kinematic_char/kinebody3d.png


BIN
3d/kinematic_char/level.scn


BIN
3d/kinematic_char/purple_wood.tex


BIN
3d/kinematic_char/purplecube.scn


BIN
3d/kinematic_char/twood.tex


BIN
3d/kinematic_char/white_wood.tex


Some files were not shown because too many files changed in this diff