Vlad2 Опубликовано 25 мая, 2014 Поделиться Опубликовано 25 мая, 2014 Всем привет, помогите решить задачу.В игре есть персонаж и нам нужно по нажатию кнопки NUM8 оказаться на 10 метров впереди своей старой позиции.Если просто прибавлять цифры к текущем координатам, то это неэффективный способ, потому что если мы посмотрим персонажем в другую сторону,то мы переместимся на 10 метров в бок,а не в перед.У меня получилось это сделать, но не совсем точно, шаг получается динамический, то больше то меньше, я сделал так:К координатам позиции персонажа X.Y, я прибавил координаты текущей скорости персонажа, тоже формата X.Y, и переместился в нужную мне сторону.Как я уже говорил, шаг перемещения зависит от скорости. А мне нужно, чтоб скорость была не изменой, а перемещение происходило в ту сторону, куда смотрит персонаж. Ссылка на комментарий Поделиться на другие сайты Поделиться
A1t0r Опубликовано 25 мая, 2014 Поделиться Опубликовано 25 мая, 2014 Всем привет, помогите решить задачу.В игре есть персонаж и нам нужно по нажатию кнопки 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 * дистанция_прыжкаПримерно так) Это только идея, вроде должно работать Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 25 мая, 2014 Поделиться Опубликовано 25 мая, 2014 Вопрос движения вперед очень интересный.Вот рабочие варианты на 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 возвратом Vector3public 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);}*/ Ссылка на комментарий Поделиться на другие сайты Поделиться
Vlad2 Опубликовано 26 мая, 2014 Автор Поделиться Опубликовано 26 мая, 2014 За вращение вокруг своей оси объект использует 2 координаты формата float в диапазоне от -1 до 1.(новоеX,новоеY,новоеZ) = (староеX,староеY,староеZ) + единичный_вектор_поворота3 * дистанция_прыжкаТоесть я беру X и Y прибавляю 2 координаты поворота к ним и домножаю на дистанцию прыжка?X(положение новое) = X(положение старое) + X(направления)*10Сделал так как и все получилось))Спасибо)))Главное найти правильные координаты направления))) Ссылка на комментарий Поделиться на другие сайты Поделиться
Bromvol Опубликовано 26 мая, 2014 Поделиться Опубликовано 26 мая, 2014 Vlad2 хотелось бы увидеть какую игру ломаешь, и скрипт рабочий увидеть с этой опцией. Я что-то пробовал в Batman Arkham City делать, но у меня получилось только перемещение строго по координатам или Х или Y. Ссылка на комментарий Поделиться на другие сайты Поделиться
A1t0r Опубликовано 26 мая, 2014 Поделиться Опубликовано 26 мая, 2014 За вращение вокруг своей оси объект использует 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 это конечно хорошо, но можно сначала отработать теорию на простой практике. Ссылка на комментарий Поделиться на другие сайты Поделиться
Vlad2 Опубликовано 27 мая, 2014 Автор Поделиться Опубликовано 27 мая, 2014 lua скрипт.function Movef()Xp = readFloat('208A0130') -- Координата X положениеXv = readFloat('208A0100') -- Координата X направлениеX = Xp+Xv*10 -- Вычисляем новую координату положенияZp = readFloat('208A0134')Zv = readFloat('208A0104')Z = Zp+Zv*10Yp = readFloat('208A0138')Yv = readFloat('208A0108')Y = Yp+Yv*10writeFloat('208A0130', X) -- Записываем новую координату положенияwriteFloat('208A0134', Z)writeFloat('208A0138', Y)endcreateHotkey(Movef, VK_NUMPAD8) -- создаем горячую клавишу NUMPAD8нужно только подставить свои адреса с координатами)Теперь меня интересует, по какой формуле можно заставить объект поворачиваться вокруг своей оси)) Ссылка на комментарий Поделиться на другие сайты Поделиться
A1t0r Опубликовано 27 мая, 2014 Поделиться Опубликовано 27 мая, 2014 lua скрипт.function Movef()Xp = readFloat('208A0130') -- Координата X положениеXv = readFloat('208A0100') -- Координата X направлениеX = Xp+Xv*10 -- Вычисляем новую координату положенияZp = readFloat('208A0134')Zv = readFloat('208A0104')Z = Zp+Zv*10Yp = readFloat('208A0138')Yv = readFloat('208A0108')Y = Yp+Yv*10writeFloat('208A0130', X) -- Записываем новую координату положенияwriteFloat('208A0134', Z)writeFloat('208A0138', Y)endcreateHotkey(Movef, VK_NUMPAD8) -- создаем горячую клавишу NUMPAD8нужно только подставить свои адреса с координатами)Теперь меня интересует, по какой формуле можно заставить объект поворачиваться вокруг своей оси))Наверно что-то близко кx = sin(t)y = cos(t) Ссылка на комментарий Поделиться на другие сайты Поделиться
Vlad2 Опубликовано 27 мая, 2014 Автор Поделиться Опубликовано 27 мая, 2014 Синус и косинус от t, а t - это что?)) Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 27 мая, 2014 Поделиться Опубликовано 27 мая, 2014 Синус и косинус от t, а t - это что?))Это тригонометрия. Ссылка на комментарий Поделиться на другие сайты Поделиться
A1t0r Опубликовано 27 мая, 2014 Поделиться Опубликовано 27 мая, 2014 Синус и косинус от t, а t - это что?))Угол в радианах - направление в котором будет смотреть персонаж Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения