Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Unity > Общие вопросы

Общие вопросы вопросы не попадающие ни в один из доступных разделов

Ответ
 
Опции темы
Старый 31.05.2013, 23:26   #1
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Кватернион. Как определить угол вращения.

В общем есть у меня вектор который совпадает с осью игрек и есть вектор к которому я хочу повернуть некоторое количество точек чьи координаты при направляющем векторе по оси игрек мне известны.
Vector3 axis = new Vector3(1,1,1); //нужная ось
axis.Normalize();
Vector3 curAxis = new Vector3(0,1,0);//текущая ось
float angle Vector3.Angle(axis,curAxis);//угол между векторами
Vector3 newAxis Vector3.Cross(axis,curAxis);//ось вращения для квартерниона
newAxis*=Mathf.Sin(angle);
Quaternion magic = new Quaternion(newAxis.x,newAxis.y,newAxis.z,Mathf.Cos(angle));
...
vert[i*(width+1)+j] = magic pos
И в общем вращение происходит в нужной плоскости, но не на тот угол что мне нужен. От какого вектора в плоскости с нормалью совпадающей с осью вращения этот угол считать?
(Offline)
 
Ответить с цитированием
Старый 31.05.2013, 23:29   #2
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Кватернион. Как определить угол вращения.

А это не подойдет? http://docs.unity3d.com/Documentatio...oRotation.html Умножить все точки на него.

Ну и вращение происходит относительно нуля координат. Попробуй вычесть центр вращения из точки, повернуть, потом прибавить центр вращения.
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
Andvrok (01.06.2013), dsd (31.05.2013)
Старый 31.05.2013, 23:38   #3
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Кватернион. Как определить угол вращения.

Подошло идеально. Выходит зря википедию по кватернионам читал )
(Offline)
 
Ответить с цитированием
Старый 01.06.2013, 03:14   #4
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Кватернион. Как определить угол вращения.

Ну и собственно то зачем мне это понадобилось.

Что-то типа плоскости прикидывающейся планетой у которой плавно растет детализация при приближении.

в архиве сам проект и собранное приложение.
Миниатюры
Нажмите на изображение для увеличения
Название: planet.jpg
Просмотров: 5568
Размер:	91.2 Кб
ID:	19217  

Последний раз редактировалось dsd, 14.11.2015 в 15:09.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pax (01.06.2013)
Старый 01.06.2013, 03:28   #5
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Кватернион. Как определить угол вращения.

Интересно, перенести бы этот алгоритм в шейдер, жрет многовато сейчас. 20 ms на обновление. Правда с нормалями надо что-то заранее сделать... кубмэпу или что-то еще... Нойз бы тоже запечь...
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 01.06.2013, 03:34   #6
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Кватернион. Как определить угол вращения.

Так этож перестроение поверхности идет каждый кадр, а в реальности оно понадобится редко, не каждую секунду точно. И там же как я понимаю куча лишних операций в кватернионе, оно ж собирает матрицу из него для каждой вершины отдельно, плюс сам алгоритм шума довольно жрущий. По идее все это можно упростить по вычислениям проецируя каждую точку на куб, где на каждую грань идет своя сохраненная карта высот и прочая полезная информация типа тестурных координат.
А пихать это в шейдер зря наверно. Усложнит на порядок же внесение модификаций в алгоритм генерации поверхности.
(Offline)
 
Ответить с цитированием
Старый 01.06.2013, 03:45   #7
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Кватернион. Как определить угол вращения.

С матрицей не быстрее, У кватерниона свое умножение на вектор нормальное. Можешь сравнить
var matrix Matrix4x4.TRS(Vector3.zeromagicVector3.one);
pos matrix.MultiplyVector(pos) ; 
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
dsd (01.06.2013)
Старый 01.06.2013, 03:51   #8
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Кватернион. Как определить угол вращения.

А я думал оно вот эту хреновину собирает чтобы повернуть:

Выражение матрицы поворота через кватернион
Если задан кватернион q = (w,x,y,z), то соответствующая матрица поворота имеет вид:
(Offline)
 
Ответить с цитированием
Старый 01.06.2013, 03:52   #9
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Кватернион. Как определить угол вращения.

Где-то около трех миллисекунд сокращает:

void Update () {
            
setVertices();    
            
Mesh mesh GetComponent<MeshFilter>().mesh;
            
//mesh.Clear(true);  - незачем
            
mesh.vertices vert;
            
mesh.uv uv;
            
//mesh.triangles = trians;   - незачем
            
mesh.RecalculateNormals();
    } 
Ну и Mesh закэшируй, искать объекты каждый кадр типа GameObject.Find или GetComponent не стоит, это медленно.


Кстати еще можно это сократить
gameObject.AddComponent("MeshFilter");
Mesh mesh GetComponent<MeshFilter>().mesh
так
Mesh mesh gameObject.AddComponent<MeshFilter>().mesh
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо pax за это полезное сообщение:
dsd (01.06.2013), St_AnGer (01.06.2013)
Старый 05.06.2013, 02:16   #10
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Кватернион. Как определить угол вращения.

pax, а вот захотел я допустим к этой хрени вращение сделать.

Vector3 angle = gameObject.transform.eulerAngles;
angle.y+=0.1f;
gameObject.transform.eulerAngles = angle;

вот так этот планетоид вращаться начинает

Как мне потом позицию камеры перевестив локальные координаты?

Vector3 campos = gameObject.transform.rotation * cam.transform.position ;
Vector3 campos = gameObject.transform.localToWorldMatrix * cam.transform.position ;
Vector3 campos = gameObject.transform.worldToLocalMatrix * cam.transform.position ;

Ничто из этого не сработало. Может я вращаю не правильно... Как?
(Offline)
 
Ответить с цитированием
Старый 05.06.2013, 07:38   #11
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Кватернион. Как определить угол вращения.

Так наверное

Vector3 campos = transform.worldToLocalMatrix.MultiplyPoint(cam.tra nsform.position);

либо так
Vector3 campos = transform.InverseTransformPoint(cam.transform.posi tion);
__________________
Blitz3d to Unity Wiki

Последний раз редактировалось pax, 05.06.2013 в 12:12.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
dsd (05.06.2013)
Старый 18.06.2013, 19:14   #12
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Кватернион. Как определить угол вращения.



Сочинил что-то типа кубомапы и вроде бы побыстрей стало.
Миниатюры
Нажмите на изображение для увеличения
Название: planet2.jpg
Просмотров: 5142
Размер:	136.3 Кб
ID:	19268  

Последний раз редактировалось dsd, 14.11.2015 в 15:08.
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо dsd за это полезное сообщение:
HolyDel (19.06.2013), Igor (20.06.2013), pax (18.06.2013)
Старый 19.06.2013, 18:50   #13
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Кватернион. Как определить угол вращения.

а исполнимый файл?
(Offline)
 
Ответить с цитированием
Старый 20.06.2013, 00:05   #14
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Кватернион. Как определить угол вращения.

Сообщение от HolyDel Посмотреть сообщение
а исполнимый файл?
да там особо не на что смотреть, на вид почти тоже самое что и раньше.

вот файл
(Offline)
 
Ответить с цитированием
Старый 28.07.2013, 03:11   #15
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Кватернион. Как определить угол вращения.



архив с ехе 10 мб

Добавил твердости планете и систему частиц кое-как прикидывающуюся облачками.

Кто-нить делал вменяемый моуслук на поверхности сферы? Чтобы камера вела себя как при обычном моуслуке но считала что ось(0,1,0) была направлена от центра сферы к позиции камеры. Как это сделать?

float sensitivity 1.5F;
        
        
        
Vector3 rotation =  cam.transform.eulerAngles;
        
// получаем значение оси ввода "Horizontal" и прибавляем его к значению вращения
        
rotation.-= sensitivity Input.GetAxis ("Mouse Y");
        
rotation.+= sensitivity Input.GetAxis ("Mouse X");
        
// устанавливаем вращение объекта
        
cam.transform.eulerAngles rotation;
        
        
//движение камеры
        
float speed 0.5f;
        
        
Vector3 move = new Vector3(0,0,0);    
        if(
Input.GetKey(KeyCode.A))move-= cam.transform.right;
        if(
Input.GetKey(KeyCode.D))move+= cam.transform.right;
        if(
Input.GetKey(KeyCode.S))move-= cam.transform.forward;
        if(
Input.GetKey(KeyCode.W))move+= cam.transform.forward;
        
        
cam.transform.position += move*speed
Миниатюры
Нажмите на изображение для увеличения
Название: 0.jpg
Просмотров: 5167
Размер:	351.1 Кб
ID:	19411  
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 06:47.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com