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

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

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

Сообщение [LUkARD] 24 авг 2011, 11:06

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);

               

        }

       

}
Последний раз редактировалось [LUkARD] 24 авг 2011, 17:02, всего редактировалось 1 раз.
Запиался на курс программирования + html!
Аватара пользователя
[LUkARD]
UNIт
 
Сообщения: 108
Зарегистрирован: 24 июн 2011, 19:37
Откуда: Оренбургская обл. г. Ясный

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

Сообщение IDoNotExist 24 авг 2011, 14:39

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

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

Решение: вам нужно чтобы вектор forward был паралелен плоскости по которой катится шар, и в то же время направлен туда, куда смотрит камера.
Последний раз редактировалось IDoNotExist 24 авг 2011, 14:47, всего редактировалось 1 раз.
Аватара пользователя
IDoNotExist
Адепт
 
Сообщения: 1432
Зарегистрирован: 23 мар 2011, 09:18
Skype: iamnoexist

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

Сообщение [LUkARD] 24 авг 2011, 14:47

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

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

Сообщение IDoNotExist 24 авг 2011, 14:55

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

Чтото совсем не то нашли, я бы посоветовал вам создать пустой GO, а затем на него повесить скрипт который будет копировать позицию вашего шара, (ВАЖНО! Только позицию а не углы поворота) а угол поворота по оси Y брать в зависимости от направления камеры, копайте функцию Quaternion.LookRotation, направление куда шар будет двигаться брать от transform.forward, данного GO, и все будет ок.
Аватара пользователя
IDoNotExist
Адепт
 
Сообщения: 1432
Зарегистрирован: 23 мар 2011, 09:18
Skype: iamnoexist

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

Сообщение [LUkARD] 24 авг 2011, 14:58

понятно..
сейчас додумался поискать на это форуме, а это бедет не проще 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?
посидел, подумал, понял, что не проще (у меня же шар)
Запиался на курс программирования + html!
Аватара пользователя
[LUkARD]
UNIт
 
Сообщения: 108
Зарегистрирован: 24 июн 2011, 19:37
Откуда: Оренбургская обл. г. Ясный

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

Сообщение [LUkARD] 24 авг 2011, 16:49

Фух #:-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
Запиался на курс программирования + html!
Аватара пользователя
[LUkARD]
UNIт
 
Сообщения: 108
Зарегистрирован: 24 июн 2011, 19:37
Откуда: Оренбургская обл. г. Ясный


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 26