Среда, 27 Ноября 2024, 22:10

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Поворот объекта к неровной поверхности
Abel399Дата: Понедельник, 14 Июля 2014, 05:29 | Сообщение # 1
Surpass your limits. Right now.
Сейчас нет на сайте
Приветствую вас, дорогие форумчане. Во время работы в Unity у меня возник один довольно коварный вопрос, ответ на который я так и не смог найти в великом Google. Точнее я нашел заметку на официальном сайте на форуме, но не понял метода реализации... Суть вопроса: мне необходимо, чтобы при движении персонажа модель поворачивалась по осям x и z так, что персонаж постоянно ногами находился на земле. Идеальный пример реализации - серия игр про Sonic'а от Sega. Есть так же видео, где данная вещь показана на Unity: http://www.youtube.com/watch?v=LGbWo9Da40M.

Мне известно лишь то, что это можно реализовать, проводя нормаль в точке столкновения с сурфейсом поверхности и поворотом на *какой-то вектор(вроде направление движения или transform.up)* -> сама нормаль (RaycastHit.normal или collision.contacts[number].normal).







Персонаж представляет из себя префаб, на котором висит Character Controller и сам скрипт управления. В дочерних объектах находится Camera и префаб модели персонажа со скелетом и мешом. На нем так же висит компонент Animation. В качестве поверхности используется обыкновенный Terrain.

Думаю, что этой информации вполне достаточно для описания моей ситуации. Спасибо за внимание и надеюсь на вашу помощь happy

P.S>Если будет необходима дополнительная информация о персонаже - сообщите, я предоставлю.


Ninja Slayer - 2D Physics Puzzle [cancelled]

Сообщение отредактировал Abel399 - Понедельник, 14 Июля 2014, 05:37
ЛевшаДата: Понедельник, 14 Июля 2014, 05:42 | Сообщение # 2
почти ветеран
Сейчас нет на сайте
Цитата Abel399 ()
Мне известно лишь то, что это можно реализовать, проводя нормаль в точке столкновения с сурфейсом поверхности и поворотом на *какой-то вектор(вроде направление движения или transform.up)* -> сама нормаль (RaycastHit.normal или collision.contacts[number].normal).

Не все так просто, если копировать normal.up на transform.up остальные оси это тоже затронет.
Надо или ровнять родителя а поворачивать парента и двигать уже по его форварду.
Или загонять normal.up в временную переменную и брать оттуда нужные оси на transform.eulerAngles.


X.cor.R (Prologue)
Abel399Дата: Понедельник, 14 Июля 2014, 06:15 | Сообщение # 3
Surpass your limits. Right now.
Сейчас нет на сайте
Левша, спасибо за отзыв smile Возрадуется великий Чингис-хан, у меня получилось повернуть игрока к поверхности:
Код
if(Physics.Raycast(transform.position, Vector3.down, RayHit)) target.rotation = Quaternion.FromToRotation(transform.up,RayHit.normal);


target - дочерний префаб модели персонажа

Но вот теперь появилась загвоздка - Terrain слегка шершавый и из-за это персонаж при движении слегка вибрирует(дрыгается, чувствуя каждую кочку). Либо мне выравнивать Terrain, либо как-то смегчать поворот... Может подскажите?) Благодарю за внимание

Добавлено (14.07.2014, 06:15)
---------------------------------------------
Неее, способ себя не оправдывает - прыжки камеры и модели просто дикие, поворот не всегда работает... Надо контроллер на модель вешать вероятно..


Ninja Slayer - 2D Physics Puzzle [cancelled]

Сообщение отредактировал Abel399 - Понедельник, 14 Июля 2014, 06:05
ЛевшаДата: Понедельник, 14 Июля 2014, 07:44 | Сообщение # 4
почти ветеран
Сейчас нет на сайте
Quaternion.Lerp

X.cor.R (Prologue)
Abel399Дата: Понедельник, 14 Июля 2014, 10:00 | Сообщение # 5
Surpass your limits. Right now.
Сейчас нет на сайте
Левша, Большое спасибо, интерполяция прекрасная вещь =) С горем пополам и бомбежкой Google я научился поворачивать объект вокруг локальной оси и теперь все выглядит просто Щикарно. Вот код, чтобы с такой проблемой никто не сталкивался:
Код
var RayHit: RaycastHit;
if(Physics.Raycast(transform.position, Vector3.down, RayHit))
{
   target.rotation = Quaternion.FromToRotation(target.up,RayHit.normal);
   target.RotateAround(target.position, target.up, rot);
}

rot - угол поворота модели по оси Y.

Еще раз спасибо за помощь =)

P.S>Ответа на маленький вопрос про Backface Culling никто не знает?

Добавлено (14.07.2014, 10:00)
---------------------------------------------
Эх... способ работает, но сглаживание достичь все равно не удалось. Бывают моменты, что модель дергается даже на ровной поверхности. Но как же в видео все так удачно реализовано.. wink


Ninja Slayer - 2D Physics Puzzle [cancelled]

Сообщение отредактировал Abel399 - Понедельник, 14 Июля 2014, 08:06
ЛевшаДата: Понедельник, 14 Июля 2014, 16:17 | Сообщение # 6
почти ветеран
Сейчас нет на сайте
Может дело в камере, ее тоже надо интерполировать.

X.cor.R (Prologue)
Abel399Дата: Вторник, 15 Июля 2014, 08:12 | Сообщение # 7
Surpass your limits. Right now.
Сейчас нет на сайте
Левша, Да нет. Камера по осям x и z вообще не поворачивается (пока, позже попробую сделать плавный поворот камеры за объектом). Тут дело в том, что нормаль поверхности получается каждый фрейм, и порой на вроде бы ровной поверхности она получается отличной от предыдущей. И, как следствие, объект резко поворачивается в ненужную сторону, а потом возвращается в исходное положение. Отсюда и появляется "дрожание" и "вибрация". Думал выровнять terrain в Photoshop, но не помогло. Все равно почему-то имеется такой феномен.

Ninja Slayer - 2D Physics Puzzle [cancelled]

Сообщение отредактировал Abel399 - Вторник, 15 Июля 2014, 08:14
allodsДата: Вторник, 15 Июля 2014, 12:20 | Сообщение # 8
почти ветеран
Сейчас нет на сайте
камера в паренте у самого перса?
ЛевшаДата: Вторник, 15 Июля 2014, 16:04 | Сообщение # 9
почти ветеран
Сейчас нет на сайте
Цитата Abel399 ()
объект резко поворачивается в ненужную сторону, а потом возвращается в исходное положение. Отсюда и появляется "дрожание" и "вибрация".

Ты не до конца понял что я выше писал...
Цитата Левша ()
и брать оттуда нужные оси на transform.eulerAngles.


X.cor.R (Prologue)

Сообщение отредактировал Левша - Вторник, 15 Июля 2014, 16:06
Abel399Дата: Четверг, 17 Июля 2014, 09:38 | Сообщение # 10
Surpass your limits. Right now.
Сейчас нет на сайте
allods, Да, в паренте. Но это не имеет значения ибо дрожит не камера, а сам персонаж, который наклоняется к поверхности. И камера следом за ним. Камеру можно и скриптом плавно поворачивать.
Левша, Я вас понял. Дело в том, что я плохо объясняю =) смотрите:
Вот поверхность:


Вот на этом бугре или неровности поверхности, персонаж поворачивается перпендикулярно бугру. Потом опять встает на сглаженную поверхность и нормально поворачивается. Вы предлагали поворачивать объект на угол в градусах по нужным осям. Это правильно, да. Но ведь можно поворачивать и сразу по компонентам Quaternion для меньших расчетов (здесь, возможно, вы можете не понять мою мысль из-за моих ужасных объяснений :D). Если идеально выровнять поверхность terrain, сделать небольшую сопочку (обязательно ровную и без сглаживания, чтобы не было бугорков), то наклон будет идеальным и правильным, без "тряски". Т.е. нужно как-то сделать так, чтобы если поверхность резко меняется в течении какого-то времени, то скрипт игнорировал поворот или же запрещал очень резкие повороты.

Эх.. Надеюсь моя писанина хоть немного понятна. Спасибо за уделенное внимание smile

P.S>А вообще это происходит из-за постоянной смены нормали к поверхности. Их видимо много в одном месте и =>Смена наклона очень резка и быстра.


Ninja Slayer - 2D Physics Puzzle [cancelled]

Сообщение отредактировал Abel399 - Четверг, 17 Июля 2014, 09:49
ЛевшаДата: Четверг, 17 Июля 2014, 18:04 | Сообщение # 11
почти ветеран
Сейчас нет на сайте
Цитата Abel399 ()
скрипт игнорировал поворот или же запрещал очень резкие повороты.

Для этого есть Lerp.

Цитата Abel399 ()
Смена наклона очень резка и быстра.

Ну как бы да, террайн тоже с умом должен быть сделан. А так то все что угодно можно довести до абсурда. smile


X.cor.R (Prologue)
Fr0sTДата: Суббота, 19 Июля 2014, 00:11 | Сообщение # 12
постоянный участник
Сейчас нет на сайте
Abel399, Делаю игру про соника(уже во второй раз) и тоже сталкивался с такой проблемой!Если я правильно понял вопрос,то чтобы он не дергался можно скорость поворота снизить.Я же в своем проекте нашел такой косяк-если я перпендикулярно поверхности поворачивал character controller то была тряска дикая - соник был то перпендикулярно то по оси у направлен,тогда я стал поворачивать перпендикулярно поверхности дочерний к character controller'у пустой объект и тряски не было.Так что я просто модель персонажа засунул внутрь этого объекта.Он только ставит персонажа перпендикулярно поверхности.А двигается он(персонаж) в ту сторону,в которую смотрит модель игрока. smile





Сообщение отредактировал Fr0sT - Суббота, 19 Июля 2014, 00:12
Abel399Дата: Вторник, 22 Июля 2014, 15:55 | Сообщение # 13
Surpass your limits. Right now.
Сейчас нет на сайте
Fr0sT, Спасибо за отзыв :-) Я так и делаю. У меня character controller висит на общем префабе, а внутри него сама моделька персонажа, которая и поворачивается. А у тебя все-таки получилось смягчить поворот?
Левша, В связи с моим неполным пониманием функции, я отложил это дело до ближайшего времени. Сейчас занимаюсь основной игровой логикой, но над решением данной "мелочи" все ещё думаю :-)

Ещё раз спасибо за внимание.


Ninja Slayer - 2D Physics Puzzle [cancelled]
Fr0sTДата: Среда, 23 Июля 2014, 08:04 | Сообщение # 14
постоянный участник
Сейчас нет на сайте
Abel399, ну да,я просто снизил скорость поворота.Вообще у меня соник поворачивается в зависмоти от скорости.



Abel399Дата: Среда, 23 Июля 2014, 16:35 | Сообщение # 15
Surpass your limits. Right now.
Сейчас нет на сайте
Fr0sT, Ясно, появилась мыслЯ. У меня просто поворот меняется каждый кадр => сглаживание тут не ощущается. И есть два выхода: сохранение времени или установка контрольных точек поворота через равные промежутки времени, что наверняка напоминало твою реализацию. Буду пробовать happy

Ninja Slayer - 2D Physics Puzzle [cancelled]
CyXoBДата: Суббота, 30 Августа 2014, 10:05 | Сообщение # 16
был не раз
Сейчас нет на сайте
Abel399, как вариант - рейкастом по тегу или по лэйеру брать нормаль с параллельного террейну объекта, который просто не рендерить. Т. е. террейн останется со своими буграми и впадинами, но персонаж всегда будет повернут перпендикулярно плоскости террейна. А вот ноги персонажа или только стопы ног, при If Grounded = True, параллелить уже по форме (нормали) террейна (буграм и впадинам), определяемой отдельным рэйкастом по самому террейну.

Сообщение отредактировал CyXoB - Суббота, 30 Августа 2014, 10:14
GantZ_YakaДата: Суббота, 30 Августа 2014, 16:14 | Сообщение # 17
почетный гость
Сейчас нет на сайте
Вот я похожую штуку делал: http://youtu.be/YQYywmPtrl8?list=UUgn9Mowbhb4btLD7GsSR1xQ
Рейкастил не лучем, а сферами. Чтоб не дрожал перс, - не надо ему постоянно угол менять, а только когда он в движении (прыгает/падает, бежит). И камера у меня там отдельно летает и сглаживается сама по себе, независимо, ни к кому не удочерена, просто в таргет добавлен персонаж, если кому интересно, вот скрипт:
Код

using UnityEngine;
using System.Collections;

public class MagicCamera : MonoBehaviour {
      
   public Transform targetCharacter;   
     
   public float posDamp; //2
   public float rotDamp; //3
   public float height; //2
   public float distance; //5
     
   private Vector3 targetPos;
      
   void Update () {
      
    if (!targetCharacter) return;    
      
    targetPos = targetCharacter.position - targetCharacter.forward * distance + targetCharacter.up * height;
      
    transform.position = Vector3.Lerp(transform.position, targetPos, posDamp * Time.deltaTime);
      
    transform.rotation = Quaternion.Slerp(transform.rotation, targetCharacter.rotation, rotDamp * Time.deltaTime );      
          
   }    
     

}
     


Сообщение отредактировал GantZ_Yaka - Суббота, 30 Августа 2014, 16:15
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг