소스 검색

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 년 전
부모
커밋
de311d7f95

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 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


이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.