x


Camera Collison with scene objects

I think this is more of a 3D math question over programming.

I have a Kinematic Ridgidbody Main camera with a .03m sphere collider that is free roaming, looking around various large scene objects while mesh colliders. Currently i can see collisions, as all my OnCollisionEnter/Stay/Exit all throw debug logs. However i want to keep the camera from passing through the object and even bounce back a bit on the angle of reflection from the camera's angle of movement and the collision point's normal reality to the collision point. (I might have to settle with the angle of incidence from the camera itself if mesh object's geometry is too complex.

As you can see with the code below I've been trying different things, and at low speeds, the camera bounces off the object at various angles given the mesh collider's state. I want to prevent pass-through of the object by the camera indefinitely.

void OnCollisionEnter(Collision info) {
        Debug.Log("Collision!");
    cameraRigidbody.isKinematic = false;

    Vector3 norm;
    norm = Vector3.Cross(info.impactForceSum.normalized);
    cameraRigidbody.AddRelativeForce(norm);


}
void OnCollisionStay(Collision info){
    Debug.Log("Colliding!");
    //cameraSpeed = 0;
    Vector3 norm;
    norm = Vector3.Cross((info.contacts[0]).point, transform.position);
            //cameraRigidbody.AddRelativeForce(norm);
    cameraRigidbody.AddRelativeForce(info.impactForceSum.normalized);
    info.contacts[
    //int bounceDistance = 1;
    //Vector3 bouncedPosition = transform.position + (bounceDistance * norm);
    //flyToPosition = bouncedPosition;
    Debug.Log("Still Colliding!");
}

void OnCollisionExit(Collision info){
    Debug.Log("Done Colliding!");
    //cameraSpeed = settings.CameraSpeed / 500f;
}
more ▼

asked Jun 09 '10 at 05:13 PM

Vince gravatar image

Vince
184 7 8 16

(comments are locked)
10|3000 characters needed characters left

1 answer: sort voted first

The reason the camera can pass through other objects is that it's kinematic. You could try changing it to a non-kinematic rigidbody and moving it by applying forces to it, but that could be a bit tricky to get right.

A simpler option would be to keep the camera kinematic and use a combination of raycasting and Physics.CheckSphere. Before moving the camera, raycast to the point you want to move to and make sure you won't be colliding with anything. You can also use Physics.CheckSphere to determine if there is enough space at the destination for your camera's collider sphere to reside without touching other colliders.

more ▼

answered Jun 09 '10 at 05:39 PM

Ehren gravatar image

Ehren
4.2k 34 43 77

I tried to temporarly make the camera non kinematic, but i guess once its moving that wont really help. For some reason, the terrain works fine. Is that a special property of the floor that Unity handles or am I missing something?

Jun 09 '10 at 05:47 PM Vince

Is the camera being controlled by the player? Or is it following something? There might be a premade script you could use (such as the First Person Controller http://unity3d.com/support/documentation/Manual/HOWTO-First%20Person%20Walkthrough.html).

Jun 10 '10 at 02:54 AM Ehren
(comments are locked)
10|3000 characters needed characters left
Your answer
toggle preview:

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Topics:

x2994
x2486
x2083

asked: Jun 09 '10 at 05:13 PM

Seen: 2409 times

Last Updated: Jun 09 '10 at 05:13 PM