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!
This commit is contained in:
Juan Linietsky
2014-09-02 23:13:40 -03:00
parent 89fa70706f
commit 1a2cb755e2
82 changed files with 5161 additions and 856 deletions
Binary file not shown.
+96
View File
@@ -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
View File
@@ -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
View File
@@ -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)
Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.