Страница 1 из 1

Непонятки с "гравитацией" [РЕШЕНО]

СообщениеДобавлено: 24 авг 2011, 11:06
[LUkARD]
HTML код для вашего блога :
Код: Выделить всё
<script language='javascript' type="text/javascript"> document.write("<iframe marginheight='0' src='http://unity3d.ru/distribution/player.php?url=http://dl.dropbox.com/u/33447202/WebPlayer.unity3d&w=600&h=450&t=true&preview=1' height='"+(450+30)+"' width='600' frameborder='0' scrolling='no'></iframe>"); </script>

если в веб демке подъехать задом к стене то шар начнет подниматьсяпо стене или лететь , если без стенки.
У меня вопрос, как решить эту проблему?
скрипт движения:
Синтаксис:
Используется javascript
var force=10;

var torque = 10;

var _IsJumping = false;

var jump = 300;



function Start(){

        Screen.lockCursor = true;

}



function OnCollisionEnter(collision : Collision) {

for (var contact : ContactPoint in collision.contacts) {

_IsJumping = false;

}

}



function FixedUpdate() {

       

        var cameraTransform = Camera.main.transform;

       

        // Forward vector relative to the camera along the x-z plane

        var forward = cameraTransform.TransformDirection(Vector3.forward);

        forward = forward.normalized;

       

        // Right vector relative to the camera

        // Always orthogonal to the forward vector

        var right = Vector3(forward.z, 0, -forward.x);

        var TorqueRight = Vector3(forward.x, 0, forward.z);

       

       

        if (Input.GetKeyDown ("r")) {

                Application.LoadLevel(0);

        }

       

        if (Input.GetKey ("a")&& !_IsJumping) {

               

                rigidbody.AddForce(right * -force, ForceMode.Acceleration);

               

        }

        if (Input.GetKey ("a")) {

               

                rigidbody.AddTorque(TorqueRight * torque);

               

        }

       

        if (Input.GetKey("d")&& !_IsJumping) {

                rigidbody.AddForce(right * force, ForceMode.Acceleration);

               

        }

        if (Input.GetKey("d")) {

                rigidbody.AddTorque(TorqueRight * -torque);

               

        }

        if (Input.GetKey("w")&& !_IsJumping) {

                rigidbody.AddForce(forward * force, ForceMode.Acceleration);

               

        }

        if (Input.GetKey("w")) {

                rigidbody.AddTorque(right * torque);

               

        }

       

        if (Input.GetKey ("s")&& !_IsJumping) {

                rigidbody.AddForce(forward * -force, ForceMode.Acceleration);

               

        }

       

        if (Input.GetKey ("s")) {

                rigidbody.AddTorque(right * -torque);

               

        }

        if (Input.GetKey ("space")&& !_IsJumping) {

                _IsJumping = true;

                rigidbody.AddForce(0,jump,0);

               

        }

       

}

Re: Непонятки с "гравитацией"

СообщениеДобавлено: 24 авг 2011, 14:39
IDoNotExist
Все просто, у вас вектор для Acceleration шара берется в зависимости от того куда направлена камера
Синтаксис:
Используется csharp
var forward = cameraTransform.TransformDirection(Vector3.forward)

а когда вы едете задом передается противоположный вектор от направления камеры, и в таком случае если вы смотрите на шар сверху вниз он будет стремиться укатиться вперед и вверх, вот поэтому и забирается по стене, тоже самое произойдет если вы будете ехать вперед, а на шар смотреть снизу вверх.

Решение: вам нужно чтобы вектор forward был паралелен плоскости по которой катится шар, и в то же время направлен туда, куда смотрит камера.

Re: Непонятки с "гравитацией"

СообщениеДобавлено: 24 авг 2011, 14:47
[LUkARD]
извиняюсь за глупый вопрос, но как сделать вектор форвард параллельным?
Просто еще ни разу не сталкивался с этим - потому и спрашиваю.
в справке что-то более менее путное нашел здесь, но ничего не понял http://unity3d.com/support/documentation/ScriptReference/Input-acceleration.html
пока что вижу только один выход - ограничить движения камеры

Re: Непонятки с "гравитацией"

СообщениеДобавлено: 24 авг 2011, 14:55
IDoNotExist
[LUkARD] писал(а):извиняюсь за глупый вопрос, но как сделать вектор форвард параллельным?
Просто еще ни разу не сталкивался с этим - потому и спрашиваю.
в справке что-то более менее путное нашел здесь, но ничего не понял http://unity3d.com/support/documentation/ScriptReference/Input-acceleration.html

Чтото совсем не то нашли, я бы посоветовал вам создать пустой GO, а затем на него повесить скрипт который будет копировать позицию вашего шара, (ВАЖНО! Только позицию а не углы поворота) а угол поворота по оси Y брать в зависимости от направления камеры, копайте функцию Quaternion.LookRotation, направление куда шар будет двигаться брать от transform.forward, данного GO, и все будет ок.

Re: Непонятки с "гравитацией"

СообщениеДобавлено: 24 авг 2011, 14:58
[LUkARD]
понятно..
сейчас додумался поискать на это форуме, а это бедет не проще http://unity3d.ru/distribution/viewtopic.php?f=18&t=5027&p=41618&hilit=%EF%E0%F0%E0%EB%EB%E5%EB%FC%ED%EE#p41622?
посидел, подумал, понял, что не проще (у меня же шар)

Re: Непонятки с "гравитацией"

СообщениеДобавлено: 24 авг 2011, 16:49
[LUkARD]
Фух #:-s Ну наконец-то до меня дошло! Ура!
Оказывается можно было просто добавить новую переменную основанную на forward и мяч перестал "ползи вверх"!
Если непонятно объяснил, вот скрипт.
Синтаксис:
Используется javascript
var force=10;

var torque = 10;

var _IsJumping = false;

var jump = 300;



function Start(){

        Screen.lockCursor = true;

}



function OnCollisionEnter(collision : Collision) {

for (var contact : ContactPoint in collision.contacts) {

_IsJumping = false;

}

}



function FixedUpdate() {

       

        var cameraTransform = Camera.main.transform;

       

        // Forward vector relative to the camera along the x-z plane

        var forward = cameraTransform.TransformDirection(Vector3.forward);

        forward = forward.normalized;

       

        // Right vector relative to the camera

        // Always orthogonal to the forward vector

        var _forward = Vector3(forward.x, 0, forward.z);

        var right = Vector3(forward.z, 0, -forward.x);

        var TorqueRight = Vector3(forward.x, 0, forward.z);

       

       

        if (Input.GetKeyDown ("r")) {

                Application.LoadLevel(0);

        }

       

        if (Input.GetKey ("a")&& !_IsJumping || Input.GetKey ("left")&& !_IsJumping) {

               

                rigidbody.AddForce(right * -force, ForceMode.Acceleration);

               

        }

        if (Input.GetKey ("a") || Input.GetKey ("left")) {

               

                rigidbody.AddTorque(TorqueRight * torque);

               

        }

       

        if (Input.GetKey("d")&& !_IsJumping || Input.GetKey("right")&& !_IsJumping) {

                rigidbody.AddForce(right * force, ForceMode.Acceleration);

               

        }

        if (Input.GetKey("d") || Input.GetKey("right")) {

                rigidbody.AddTorque(TorqueRight * -torque);

               

        }

        if (Input.GetKey("w")&& !_IsJumping || Input.GetKey("up")&& !_IsJumping) {

                rigidbody.AddForce(_forward * force, ForceMode.Acceleration);

               

        }

        if (Input.GetKey("w") || Input.GetKey("up")) {

                rigidbody.AddTorque(right * torque);

               

        }

       

        if (Input.GetKey ("s")&& !_IsJumping || Input.GetKey ("down")&& !_IsJumping) {

                rigidbody.AddForce(_forward * -force, ForceMode.Acceleration);

               

        }

       

        if (Input.GetKey ("s") || Input.GetKey ("down")) {

                rigidbody.AddTorque(right * -torque);

               

        }

        if (Input.GetKey ("space")&& !_IsJumping) {

                _IsJumping = true;

                rigidbody.AddForce(0,jump,0);

               

        }

       

}



вот черт! X( появилась новая проблема - теперь если камеру наклонить ниже, то мяч ускоряется

ДА!ДА!Оказывается для новой переменной гадо было брать векто только по z