algoritym za 3d rotation

14 отговора 474 прегледа
#1

algoritym za 3d rotation

trqbva mi algoritym za 3d rotaciq na tochka okolo prava (vektor).

mamma mia
Отговор
в отговор на naskovoto #2

Re: algoritym za 3d rotation

Такава директна формула не зная, но може да се изведе.

1- първо правиш една транслациа, която да премести правата така, че да пресича началото O на координетнете система; това значи към всички точки (обекти) да добавяш един вектор T=(x, y, z); за да върнеш точките обратно се използва -T=(-x, -y, -z) - това ще ти трябва.
2- след това с една ротация около началото O изправаш правата да съвпадне с някоя от осите, да речем Oz; това значи да сметнеш една ротационна матрица R с размер 3x3 и с нея да умножаваш всички точки (обекти) от графиката ти; тази матрица се състои от някякви cos, sin, ... може да се намери формулата; Обратното преобразувание връщащо правата на мястото си е матрицата S, която е обратна на R - и това щи ти трябва.
3- сега, просто ротираш около аста Oz (т. е. около правата, понеже съвпада); Тази ротация отново е матрица както в точка 2.
4- най накрая връщаш всички обекти в начална позиция, като първо ги умножаваш с обратната матрица S от точка 2 и след това ги транслираш с вектора -T.

Ако предварително разрешиш тези последоветелни суми на вектори и умножения на матрици предполагам, че ще се стигне до едно единствено умножение с една матрица; така нямя да влачиш излишно обектите насам-натам.

Мисля, че това е начина. Ако има някоя директна фармула тя ще е изведена по този начин. Aлтернатива е да си мислиш не, че местиш обектите, а че местиш координатната система, но резултата си е един и същи: тези два варианта се наричаха някяде пасивна и активна гледна точка и водят до един и същи резултат.

Ако не ти е нужна голяма скорост няма нужда да разрешаваш тези операции и да търсиш кратката формула. Веднъж направих едно такова влачене напред-назад и стана достатъчно бързо - а така е и по-проста програмата.

Отговор
в отговор на weyl #3

Re: algoritym za 3d rotation

Как ти трябва, вградена в някоя библиотека, или искаш ти сам да си я напишеш :))))))))
(да не учиш КГ ву ТУ)

Отговор
в отговор на naskovoto #4

Re: algoritym za 3d rotation

Можеш да видиш алгоритъма и формулата в
"Математические основь машинной графики" на Д.Роджерс и Дж.Адамс, Москва, Машиностроение, 1980г, стр.61
(Matchematical Elements for Computer Graphics, David Rogers, J.Alan Adams).
Чети и пей.

Отговор
в отговор на Eмилиo #5

Re: algoritym za 3d rotation

bash tam ucha i bash za tova mi trqbva.
ama mai shte go porazbiq na vyrtene okolo glavnite osi - inache shte stane mnogo obyrkano i moje bi bavno :)))

mamma mia
Отговор
в отговор на Учeниka #6

Re: algoritym za 3d rotation

ne mislish che shte trygna da tyrsq nqkvi knigi nali. za taq rabota si ima forumi :))

mamma mia
Отговор
в отговор на naskovoto #7

Re: algoritym za 3d rotation

i kurs po geometria pri chavdar lozanov v SU inache metoda po gore e pravilnia svejdajki vsicko do edna matrica koiato se polucava kato proizvedenie na drugite dve ot prostite transformacii - translacia i rotacia na prava prez O

Отговор
в отговор на xenomeno #8

formuli

abe, coveka iska formuli!

a, b, c agli na zavartane okolo osi saotverno X,Y,Z

smiatas ednokratno:
sx:=sin(a);cx:=cos(a);
sy:=sin(b);cy:=cos(b);
sz:=sin(c);cz:=cos(c);

posle za vseka tocka (x,y,z) ot obekta smetas:
xn:=x*cz-y*sz;yn:=x*sz+y*cz;
x:=xn*cy-z*sy;z:=xn*sy+z*cy;
y:=yn*cx-z*sx;z:=yn*sx+z*cx;

Отговор
в отговор на CALL-151 #9

Re: formuli

uraaa pravilno choveche ti si psiholog :) verno formuli mi trqbvat.
ama ne razbrah samo a,b i c agli mejdu pravata i osite li e?
ili trqbva da znam tochkite na kakvi ygli iskam da gi vyrtq okolo glavnite osi?


shtoto problema e sledniq:
trqbva da napravq rotaciq na obekt chrez vlachene na vryh s mishka.
kakto znaem mishkata si e mishka i ne e visokoprohodima ta da pylzi v 3mernoto prostranstvo. sledovatelno se dviji v XY. ili nqkakva ravnina (za prostota usporedna na XY a zashto ne syvpadashta s XY) znachi fashtam si az tochkata i trqbva da zavyrtq obekta v 3d!?! za centyr na vyrtene priemame TOCHKATA 0,0,0. syshto taka znaem che kato sme hvanali edna tochka tq obrazuva prava minavashta prez centyra i obekta moje da si se vyrti bezrazborno okola taq prava.

eto moite razsyjdeniq:
imame x,y,z na tochkata koqto hvashtame. vlachim s mishkata i sled kraen broi glavoblyskaniq izmislqne algoritym za namirane na novite x1,y1,z1. :)
sled tova namirame normalniq vektor na ravninata obrazuvana ot
(0,0,0);(x,y,z);(x1,y1,z1) posle postroqvane prava s toq vektor, minavashta prez (0,0,0) ako izobshto ni trqbva. I nakraq vyrtim vsichki tochki na smetnat ygyl okolo taq prava.

ta ako a,b i c sa ygli na koito se rotira tochkata koqto sym hvanal okolo glavnite osi vyprosyt e kak sha gi namerq tiq ygli? :))

mamma mia
Отговор
в отговор на naskovoto #10

Re: formuli

imah programka, koqto prawe6e to4no ne6to takowa i be6e pisana to4no kato kursowa rabota po grafika pri radimila stoqnowa. edinstweniq problem be6e, 4e e pisana za dos. ako iska6, daj email da ti pratq source-a.
setih se i o6te ne6to, maj be6e na pascal. ako towa ne te pritesnqwa, postni si email-a.

stoj, ta gledaj
Отговор
в отговор на lndependent #11

Re: formuli

ostavil sym ti belejka :)
danke very schoen.
a i v profila mi ima email.
a Radmila stoqnova kakvo kaza za zadachkata? :)))

mamma mia
Отговор
в отговор на naskovoto #12

Re: formuli

Извинявам се че се обаждам отново.
Аз също съм правил въртене с мишката, но по по-прост начин. За потребителя си остава илюзията, че върти с мишката, както му се иска.
Приел съм, че координатната ос Oz е перпендикулярна на екрана и насочена към мен, а осите Ox и Oy са в плоскостта на екрана и насочени наляво и надоло (стандартно). Няма никакво значение къде е центъра O (но го слагам обикновенно в центъра).
После след някое Button-Down запомнам координатите P0=(X0, Y0) на мишката и при последващи Mouse-Move даващо координати P=(X, Y) прeсмятам разликата D=(Dx, Dy)=(X-X0, Y-Y0); като след това запомням P0=P за следващото движение.
... Така, че на всяко движение имам D=(Dx, Dy); Сега използвам Dx за ъгол на завъртане около Ox - например alpha = -0.02*Dx и аналогично имам въртене около Oy на ъгъл beta = +0.02*Dy. Коефицента 0.02 съм го взел експериментално - както ми харесва скоростта на въртенето.
... Това е идеята. След това от alpha и beta получаваш ротационна 3x3 матрица с която умножаваш всички точки (3D вектори) за да завъртиш образа.

Понеже искаш формули, а на мен не ми се свиди по-долу съм ти копирал две функции с които от alpha и beta да получиш ротационната матрица.

void XCreateXMatrix(double alpha, double m[][3])
{
/*
* завъртяне на alpha около OX
*/
double c, s;

c = cos(alpha);
s = sin(alpha);
m[0][0] = 1.0; m[0][1] = 0.0; m[0][2] = 0.0;
m[1][0] = 0.0; m[1][1] = c; m[1][2] = s;
m[2][0] = 0.0; m[2][1] = -s; m[2][2] = c;
}

void XCreateYMatrix(double beta, double m[][3])
{
/*
* завъртяне на beta около OY
*/
double c, s;

c = cos(beta);
s = sin(beta);
m[0][0] = c; m[0][1] = 0.0; m[0][2] = -s;
m[1][0] = 0.0; m[1][1] = 1.0; m[1][2] = 0.0;
m[2][0] = s; m[2][1] = 0.0; m[2][2] = c;
}

.

После с умножение на две матрици M = M1 * M2 където М1 е завъртяне около OX а M2 е завъртяне около OY ще получиш общото завъртяне с матрицата M.
- може да се напише програмка която веднага смята M, ама аз съм го разделил на две части за простота и за да се използва и за други цели;
- не е все едно да пресметнеш M1 * M2 или M2 * M1 понеже умножението на матрици не е комутативно;
- само с две последователни въртения около две неуспоредни прави може да получиш всички останали ротации (ние използваме две въртения около OX, OY);

Стига толкова, че много се раздрънках и пак ще ме оплюят :)
Дано това ти е от полза - писах го само за да помогна, и не са ми нужни благодарности...

Отговор
в отговор на weyl #13

dobavka

> ... Сега използвам Dx за ъгол на завъртане около Ox - например alpha = -0.02*Dx
> и аналогично имам въртене около Oy на ъгъл beta = +0.02*Dy

Ролята на Dx и Dy трябва да се разменят, понеже такава е логиката на user-a:

Ъгъл около оста Ox: alpha = - 0.02 * Dy
Ъгъл около оста Ox: beta = + 0.02 * Dx

Освен това наистина трябва да паставиш началото O в центъра на екрана - иначе въртенето няма да изглежда естествено.
Ако в логиката на програмата O не е в центъра или осите са ориентирани по друг начин - пак става като промениш тези сметки по подходящ начин. Знака пред alpha също идва от избраната ориентация на координатната система.

С един експеримент всичко става ясно.
Айде, чао.

Отговор
в отговор на b33 #14

Re: dobavka

mersi vi.
mislq che shte se usetq za drebnite greshki shtoto ne sym chak tolkova zle.
a i ne e chak tolkova prosto. iznikna i drug problem.
kogato dvijish nqkoi vryh s mishkata e logichno mishkata da ti syvpada s vyrha koito mestish. a kakto znaem ti se dvijish po ravninata na proekciqta. za da e realistichno e hubavo obekta da se proektira s perespektiva taka che Dx i Dy po proekcionnata ravnina izobshto ne saotvetstvat na realnite Dx i Dy.
to se pravqt razni kvadratni uravneniq to e edno chudo... ama shte gi spravim.

mamma mia
Отговор
в отговор на naskovoto #15

Re: formuli

kaza 6 :-)
taka 4e kato i slovi6 UI, 6te q smae6

stoj, ta gledaj
Отговор