Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: вращение точки на сфере в полярных координатах
Форум .:3DCenter.ru:. > Общие вопросы > Анимация
KOLANICH
как повернуть точку на сфере на опр уголы?
нужно уравнение в полярных координатах
Exactamente
начала координат у обеих систем совпадают
полярные задаются r - радиус сферы, a - угол
привычные декартовы задаются привычными x,y
тогда

в декартовых
x=r*cos(a)
y=r*sin(a)


в полярных
а=arccos(x/r) или a=arcsin(y/r)
r=sqr(x*x+y*y)

как-то так...
KOLANICH
point1.a+=dZenith;
point1.b+=dAzimuth;
a - зенит (угол с вертиикалью)
b - азимут (угол с лучём, напровленным на нас)

у меня так
точка почему-то выписывает восьмёрки (в проэкциии на пл-ть экрана)
на сфере движется чёрт знает как
Exactamente
не уверен что на 100% смогу помочь, но все же - можно более полный код увидеть? Вот этот кусок, который считает координаты. Ты же полярные все равно переводишь в XYZ, да? Мб там что-то не так? Более математически рассуждая, если рисует восьмерку (наклоненную на 45*, да?), то у тебя где-то синус с косинусом попутаны. Не хватает смещения на pi/2. А если не наклоненную, то какая-то координата в 2 раза меньше другой. Это если я правильно помню матан >_<

это для двумерного про-ва, для трехмерного хз даже) мб стоит каждую из 3 плоскостей отдельно считать?
KOLANICH
да ,полярные всё равно буду переводить в декартовы

Код
    point1.x=this.radius*Math.sin(point1.a)*Math.sin(point1.b); //абсцисса на п-ти монитора
    point1.y=this.radius*Math.cos(point1.a); // ордината на плоскости монитора
    point1.sizeMult=Math.pow(2,(Math.sin(point1.a)*Math.cos(point1.b))); // множитель размера, зависящий от z



пространство, разумеется, 3хмерное


выкладываю движ точки при приращении азимута 0,2
зенита 0,1

обратно движется так же, только блииже к нам
чем точка ближе к нам, тем она больше
Exactamente
попробуй так:

CODE
point1.y=this.radius*Math.cos(point1.a) *Math.sin(point1.b); // ордината на плоскости монитора
т.е. в ординату добавить умножение на синус азимута

а в третьей строчке не знаю что такое Math.pow, но зависимости от зенита (а) не должно быть, только от азимута b
KOLANICH
pow - возведение в степень
Код
this.radius*Math.sin(point1.a)*Math.cos(point1.B) координата по z (z перп экрану)





насчёт
Цитата
в ординату добавить умножение на синус азимута
- пробовал, получилась вообще хрень, да и не нужно это, формулы перевода в декартову систему координат верные
http://ru.wikipedia.org/wiki/%D0%A1%D1%84%....BD.D0.B0.D1.82

(там оси обозначены как в математике
мои их
y <- z
x <- y
z <- x

)


нужно копать в сторону формул в полярных (тьфу в сферических) координатах
Exactamente
вот и я говорю, что не хватает синуса азимута, у тебя это b, а на википедии тета, вторая строчка, второй множитель ;]

твои и их бери одинаковые, чтоб не путаться. Экран XoY, лежит на столе, а мы наклонились над ним, и смотрим сверху. Потому что ты оси назвал по-своему, а зенит и азимут считаешь от википедивских. Азимут у тебя от твоего у (бывшего z) считается, а зенит от твоего z, бывшего х на википедии. Еще проще - забей на эту картинку и сразу всё поймешь smile.gif

и с такими формулами при приращении азимута 0.2 и зенита 0.1, должна получиться восьмерка, наклоненная влево на 45*
С правильными размерами точки верхняя левая половинка восьмерки и нижняя правая будут "тоньше" других двух, они как бы на той стороне сферы, вдалииии... smile.gif
KOLANICH
1 в википедииии зенит - тета, у меня -а
2 мой y это их z
3 не в обозначениях дело
эти координаты указаны с учётом камеры (то есть в википедии экран параллелен yz)
просто надо ось z переименовать в у
х в z
y в х
и тогда те формулы перейдут в мои
(если честно, то я их сначала сам вывел, а потом посмотрел в википедию)

Exactamente
>1 в википедииии зенит - тета, у меня -а
стопудов, ты еще и это перепутал, а я тебе поверил)) а ведь путался и думал все время - как-то странно они названы, наоборот бы и будет самое то)

x идёт вправо
у идет вверх
z идет из монитора в глаз

a - азимут, угол от х против часовой
b - зенит, угол от z (а ты их перепутал и сказал мне наоборот), от вертикали из монитора

считаются они как:
CODE
point1.x=this.radius*Math.cos(point1.a)*Math.sin(point1.b);
point1.y=this.radius*Math.sin(point1.a) *Math.sin(point1.b);

чуть выше я был неправ, и надо домножить на синус зенита b и поменять формулы х и у наоборот
KOLANICH
Цитата
Код
point1.y=this.radius*Math.sin(point1.a) *Math.sin(point1.b);

меняем у на z, получаем формулу, не согл с формулой из википедии

аналогично с первой формулой
Exactamente
>меняем у на z, получаем формулу, не согл с формулой из википедии

Кто тебе дал право менять y на z, и оставлять те же a и b?


Это такая же глупость дерзость, как с делением на ноль))
0*8=0*6=0*0
сокращаем нули, получаем
8=6=0
Парадокс! biggrin.gif

короче, если формулы из десятого поста не работают, то у тебя кроме этого есть еще косяки в коде. Разбирайся smile.gif А мавр своё дело сделал, мавр может удалиться.
KOLANICH
c твоиими формулами вращение ииидёт так, как будто точкиии основательно нажрались
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2019 IPS, Inc.