Перейти к содержанию

Перемещение объекта в 3D пространстве, взаданую сторону


Рекомендуемые сообщения

Всем привет, помогите решить задачу.

В игре есть персонаж и нам нужно по нажатию кнопки NUM8 оказаться на 10 метров впереди своей старой позиции.

Если просто прибавлять цифры к текущем координатам, то это неэффективный способ, потому что если мы посмотрим персонажем в другую сторону,то мы переместимся на 10 метров в бок,а не в перед.

У меня получилось это сделать, но не совсем точно, шаг получается динамический, то больше то меньше, я сделал так:

К координатам позиции персонажа X.Y, я прибавил координаты текущей скорости персонажа, тоже формата X.Y, и переместился в нужную мне сторону.

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

Ссылка на комментарий
Поделиться на другие сайты

Всем привет, помогите решить задачу.

В игре есть персонаж и нам нужно по нажатию кнопки NUM8 оказаться на 10 метров впереди своей старой позиции.

Если просто прибавлять цифры к текущем координатам, то это неэффективный способ, потому что если мы посмотрим персонажем в другую сторону,то мы переместимся на 10 метров в бок,а не в перед.

У меня получилось это сделать, но не совсем точно, шаг получается динамический, то больше то меньше, я сделал так:

К координатам позиции персонажа X.Y, я прибавил координаты текущей скорости персонажа, тоже формата X.Y, и переместился в нужную мне сторону.

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

Насколько я понимаю игра в 3D. Да даже если и в 2D, то у каждого объекта мира должны быть локальные координаты. Например, персонаж смотрит вперёд по оси X, верх это пусть Y, а право - Z. Тогда тебе нужно получить доступ к локальной оси X и умножить (X,Y,Z) на (расстояние,0,0). Примерно так это выглядит в Unity3D. Здесь должно быть что-то похожее)

Если нет никакой локальной системы, надо знать угол поворота персонажа и положение в глобальной системе. Просто покрутись на одном месте, чтобы найти направление взгляда персонажа. Угол будет либо в градусах, либо в виде единичного вектора. Тогда формула будет такой:

(новоеX,новоеY,новоеZ) = (староеX,староеY,староеZ) + единичный_вектор_поворота3 * дистанция_прыжка

Примерно так) Это только идея, вроде должно работать

Ссылка на комментарий
Поделиться на другие сайты

Вопрос движения вперед очень интересный.

post-3-0-77011000-1401014852_thumb.png

Вот рабочие варианты на Unity3d. Создать скрипт TestTransform и повесить его на кубик. Создать местность чтобы можно было увидеть как кубик двигается - по локальному вектору Z (Z - это вперед в Unity3d, X - влево, Y - вверх). Вариант 4, наверно, подойдет.

Но в реальной игре надо выключить гравитацию и коллизии (чтобы можно было проходить сквозь стены). В CE сделать скрипт, чтобы при удержании какой-то кнопки скорость движения вперед увеличивалась постепенно.


using UnityEngine;
using System.Collections;

public class TestTransform : MonoBehaviour {

public float speed = 1f; // скорость движения вперд
Transform myTransform; // класс Transform для управления объектом

#region MonoBehavior
//Срабатывает при загрузке сцены
void Awake(){
myTransform = transform;
}
// Срабатывает каждый кадр
void Update() {
// 1. Вариант
//myTransform.Translate(Vector3.forward * speed * Time.deltaTime);
// 2. Вариант
//myTransform.position += myTransform.TransformDirection(Vector3.forward * speed * Time.deltaTime);
// 3. Вариант
//myTransform.position = myTransform.position + myTransform.localRotation * Vector3.forward * speed * Time.deltaTime;
// 4. Вариант
float speedPerFrame = speed * Time.deltaTime;
Vector3 a2 = Vector3.forward * speedPerFrame; // Vector3.forward это new Vector3 (0f, 0f, 1f);
Vector3 a3 = Imull(myTransform.localRotation, a2);
myTransform.position = myTransform.position + a3;
}
#endregion

// Умножение Quaternion на Vector3 c возвратом Vector3
public Vector3 Imull(Quaternion rotation, Vector3 point)
{
float num = rotation.x * 2f;
float num2 = rotation.y * 2f;
float num3 = rotation.z * 2f;
float num4 = rotation.x * num;
float num5 = rotation.y * num2;
float num6 = rotation.z * num3;
float num7 = rotation.x * num2;
float num8 = rotation.x * num3;
float num9 = rotation.y * num3;
float num10 = rotation.w * num;
float num11 = rotation.w * num2;
float num12 = rotation.w * num3;
Vector3 result;
result.x = (1f - (num5 + num6)) * point.x + (num7 - num12) * point.y + (num8 + num11) * point.z;
result.y = (num7 + num12) * point.x + (1f - (num4 + num6)) * point.y + (num9 - num10) * point.z;
result.z = (num8 - num11) * point.x + (num9 + num10) * point.y + (1f - (num4 + num5)) * point.z;
return result;
}
}

/*
using System;
using UnityEngine.Internal;
[ExcludeFromDocs]
public void Translate (Vector3 translation)
{
Space relativeTo = Space.Self;
this.Translate (translation, relativeTo);
}

-------
using System;
using UnityEngine.Internal;
public void Translate (Vector3 translation, [DefaultValue ("Space.Self")] Space relativeTo)
{
if (relativeTo == Space.World)
{
this.position += translation;
}
else
{
this.position += this.TransformDirection (translation);
}
}
----------
using System;
public Vector3 TransformDirection (Vector3 direction)
{
return Transform.INTERNAL_CALL_TransformDirection (this, ref direction);
}
*/

Ссылка на комментарий
Поделиться на другие сайты

За вращение вокруг своей оси объект использует 2 координаты формата float в диапазоне от -1 до 1.

(новоеX,новоеY,новоеZ) = (староеX,староеY,староеZ) + единичный_вектор_поворота3 * дистанция_прыжка

Тоесть я беру X и Y прибавляю 2 координаты поворота к ним и домножаю на дистанцию прыжка?

X(положение новое) = X(положение старое) + X(направления)*10

Сделал так как и все получилось))Спасибо)))Главное найти правильные координаты направления)))

Ссылка на комментарий
Поделиться на другие сайты

Vlad2 хотелось бы увидеть какую игру ломаешь, и скрипт рабочий увидеть с этой опцией. Я что-то пробовал в Batman Arkham City делать, но у меня получилось только перемещение строго по координатам или Х или Y.

Ссылка на комментарий
Поделиться на другие сайты

За вращение вокруг своей оси объект использует 2 координаты формата float в диапазоне от -1 до 1.

Тоесть я беру X и Y прибавляю 2 координаты поворота к ним и домножаю на дистанцию прыжка?

X(положение новое) = X(положение старое) + X(направления)*10

Сделал так как и все получилось))Спасибо)))Главное найти правильные координаты направления)))

Я пробовал ковырять недавно обсуждаемую Vietcong 2. Там углы поворота в радианах. Причём они не зациклены - значение накапливается. Нужно брать остаток от деления на 6.315.

Так что тебе попался лёгкий случай)

Vlad2 хотелось бы увидеть какую игру ломаешь, и скрипт рабочий увидеть с этой опцией. Я что-то пробовал в Batman Arkham City делать, но у меня получилось только перемещение строго по координатам или Х или Y.

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

Можно потренироваться, как в своё время делал keng, на кошках Crimsonland. Только там, насколько помню, был скрипт на телепорт чисто по координатам X или Y. Batman Arkham City это конечно хорошо, но можно сначала отработать теорию на простой практике.

Ссылка на комментарий
Поделиться на другие сайты

lua скрипт.


function Movef()
Xp = readFloat('208A0130') -- Координата X положение
Xv = readFloat('208A0100') -- Координата X направление
X = Xp+Xv*10 -- Вычисляем новую координату положения

Zp = readFloat('208A0134')
Zv = readFloat('208A0104')
Z = Zp+Zv*10

Yp = readFloat('208A0138')
Yv = readFloat('208A0108')
Y = Yp+Yv*10

writeFloat('208A0130', X) -- Записываем новую координату положения
writeFloat('208A0134', Z)
writeFloat('208A0138', Y)
end
createHotkey(Movef, VK_NUMPAD8) -- создаем горячую клавишу NUMPAD8

нужно только подставить свои адреса с координатами)

Теперь меня интересует, по какой формуле можно заставить объект поворачиваться вокруг своей оси))

Ссылка на комментарий
Поделиться на другие сайты

lua скрипт.


function Movef()
Xp = readFloat('208A0130') -- Координата X положение
Xv = readFloat('208A0100') -- Координата X направление
X = Xp+Xv*10 -- Вычисляем новую координату положения

Zp = readFloat('208A0134')
Zv = readFloat('208A0104')
Z = Zp+Zv*10

Yp = readFloat('208A0138')
Yv = readFloat('208A0108')
Y = Yp+Yv*10

writeFloat('208A0130', X) -- Записываем новую координату положения
writeFloat('208A0134', Z)
writeFloat('208A0138', Y)
end
createHotkey(Movef, VK_NUMPAD8) -- создаем горячую клавишу NUMPAD8

нужно только подставить свои адреса с координатами)

Теперь меня интересует, по какой формуле можно заставить объект поворачиваться вокруг своей оси))

Наверно что-то близко к


x = sin(t)
y = cos(t)

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.