Вверх ↑
Этот топик читают: Гость
Ответов: 63
Рейтинг: 8
#1: 2010-05-10 12:49:15 ЛС | профиль | цитата
Как можно реализовать фиксированную независимую точку в системе координат OpenGL? Вопрос такой у меня встал, когда начал делать анимацию. Вот например у меня задана хаотичная анимация и если я создаю новую точку то она создается относительно другой предыдущей точки. А если я создам такую точку вначале схемы, то поедят в сторону все объекты.
карма: 1

0
Ответов: 8915
Рейтинг: 823
#2: 2010-05-10 13:36:32 ЛС | профиль | цитата
recoshet, это свойство GL - перемещается и поворачивается система координат и новый объект всегда рисуется от начала координат, поэтому надо или вычислять необходимое положение, или возвращать координаты в исходное положение путём зеркального повторения ранее выполненных перемещений (с знаком "-", естественно)
карма: 19

1
Голосовали:recoshet
Ответов: 63
Рейтинг: 8
#3: 2010-05-10 13:38:57 ЛС | профиль | цитата
Ну я такой путь решения обдумывал но это ещё плюс тонны компонентов Спасибо!
карма: 1

0
Ответов: 8915
Рейтинг: 823
#4: 2010-05-10 13:47:54 ЛС | профиль | цитата
recoshet, "Без труда не вытащишь рыбку из пруда!" и ещё есть много народной мудрости на эту тему
карма: 19

0
Администрация
Ответов: 15295
Рейтинг: 1519
#5: 2010-05-10 14:56:37 ЛС | профиль | цитата
Леонид писал(а):
или возвращать координаты в исходное положение путём зеркального повторения ранее выполненных перемещений (с знаком "-", естественно)

зачем так сложно? для этого есть методы pushmatrix и popmatrix сохраняющие и восстанавливающие матрицу пространственных преобразований.
карма: 27
1
Голосовали:recoshet
Ответов: 8915
Рейтинг: 823
#6: 2010-05-10 15:04:54 ЛС | профиль | цитата
Dilma, у меня был отрицательный опыт использования этих методов в очень длинной схеме (своей ошибки не исключаю ), поэтому не решился рекомендовать коллеге.
карма: 19

0
Ответов: 1304
Рейтинг: 405
#7: 2010-05-10 15:24:59 ЛС | профиль | цитата
recoshet, пока делал пример были произнесены все за и против, но пример думаю не помешает.


Add(MainForm,15261923,42,-14)
{
Left=20
Top=105
Width=440
Height=421
Point(MouseX)
Point(MouseY)
Point(onResize)
Point(Handle)
link(onCreate,16299401:doEvent1,[(86,6)(86,55)])
link(onResize,16131419:doWork1,[(158,13)])
}
Add(GL_Main,12986311,182,49)
{
link(onInit,12198675:doInit,[])
link(onViewPort,3410847:doPerspective,[(237,62)(237,104)])
link(Handle,15261923:Handle,[(188,44)(62,44)])
}
Add(Timer,9506849,70,133)
{
Interval=10
Enable=1
link(onTimer,1049454:doEvent1,[])
}
Add(GL_GTools,771925,182,133)
{
Point(doClear)
Point(doPushMatrix)
Point(doPopMatrix)
}
Add(Hub,1049454,119,133)
{
OutCount=5
link(onEvent1,771925:doClear,[])
link(onEvent2,771925:doPushMatrix,[])
link(onEvent3,1301667:doDraw,[(147,153)(147,174)])
link(onEvent4,771925:doPopMatrix,[(170,160)(170,153)])
link(onEvent5,12986311:doFlip,[(166,167)(166,69)])
}
Add(Hub,16299401,98,49)
{
OutCount=3
link(onEvent1,12986311:doInit,[])
link(onEvent2,16131419:doWork2,[])
link(onEvent3,9506849:doTimer,[(140,69)(140,107)(60,107)(60,139)])
}
Add(GL_GluTools,12198675,245,49)
{
link(onInit,1101264:doEnabled,[])
}
Add(GL_Light,14989894,441,49)
{
}
Add(GL_Options,1101264,294,49)
{
link(onEvent,5851269:doEnabled,[])
}
Add(GL_Options,5851269,343,49)
{
Flag=1
link(onEvent,5809249:doEnabled,[])
}
Add(GL_Options,5809249,392,49)
{
Flag=2
link(onEvent,14989894:doEnabled,[])
}
Add(GL_Perspective,3410847,245,98)
{
Fovy=20
}
Add(HubEx,16131419,154,56)
{
link(onEvent,12986311:doViewPort,[])
}
Add(GL_Color,2427377,350,168)
{
Color=65280
link(onColor,15273974:doPushMatrix,[])
}
Add(GL_Color,1947093,350,210)
{
Color=255
link(onColor,11252965:doTranslate,[])
}
Add(Hub,12827213,301,168)
{
OutCount=4
link(onEvent1,16116103:doNext,[(327,174)(327,125)])
link(onEvent2,2427377:doColor,[(333,181)(333,174)])
link(onEvent3,1947093:doColor,[(333,188)(333,216)])
link(onEvent4,6572460:doColor,[(324,195)(324,258)])
}
Add(GL_Color,6572460,350,252)
{
Color=16711680
link(onColor,1894757:doTranslate,[])
}
Add(Gl_Axis,1301667,252,168)
{
Length=0.3
TitleScale=0.2
TitleSpace=0.1
link(onDraw,12827213:doEvent1,[])
}
Add(GL_Sphere,12099886,483,168)
{
Radius=0.1
link(onDraw,15086535:doPopMatrix,[])
}
Add(GL_Sphere,7859812,441,210)
{
Radius=0.1
}
Add(GL_Sphere,4096170,441,252)
{
Radius=0.1
}
Add(GL_GTools,15273974,399,168)
{
Point(doPushMatrix)
link(onEvent,10448704:doTranslate,[])
}
Add(GL_GTools,15086535,525,168)
{
Point(doPopMatrix)
}
Add(Gl_Translate,10448704,441,168)
{
link(onTranslate,12099886:doDraw,[])
link(Y,6398495:Result,[(454,160)(447,160)])
}
Add(Gl_Translate,11252965,399,210)
{
X=1
link(onTranslate,7859812:doDraw,[])
}
Add(Gl_Translate,1894757,399,252)
{
Y=1
link(onTranslate,4096170:doDraw,[])
}
Add(Counter,16116103,350,119)
{
Min=-100
link(onNext,14559760:doOperation,[])
}
Add(Math,6398495,441,119)
{
OpType=33
}
Add(Math,14559760,399,119)
{
OpType=3
Op2=100
link(onResult,6398495:doOperation,[])
}

карма: 3

1
Голосовали:recoshet
Ответов: 2236
Рейтинг: 676
#8: 2010-05-10 18:21:50 ЛС | профиль | цитата
recoshet, пользуйся pushmatrix и popmatrix елемент GL_GTool. Самое главное чтоб количество push было равно pop, то есть сколько раз сохранишь матрицу преобразования столько ее и восстанови (до отрисовки буфера накопления). Последовательность может быть различная лишь бы количество pop (восстановлений) не превышало push (сохранений). Работает как стек.
К примеру

сохранил (1),
передвинул
повернул
восстановил (1)
сохранил(2)
передвинул
сохранил(3)
передвинул
сохранил(4)
передвинул
восстановить(4)
восстановить (3)
восстановить (2)
передвинул.
Вот эта схема может поможет:code_18176.txt

карма: 11

1
файлы: 1code_18176.txt [6.7KB] [230]
Голосовали:recoshet
Ответов: 1304
Рейтинг: 405
#9: 2010-05-10 18:40:10 ЛС | профиль | цитата
Вот эта схема может поможет:


карма: 3

0
Ответов: 8915
Рейтинг: 823
#10: 2010-05-10 18:45:09 ЛС | профиль | цитата
sla8a, какой же Вы молодец, не глядя у меня ошибку нашли! (сейчас посчитал )
карма: 19

0
Ответов: 63
Рейтинг: 8
#11: 2010-05-10 19:02:07 ЛС | профиль | цитата
[offtop]Во! Спасибо! Многое узнал сегодня [/offtop]
Еще маленькая поправочка
елемент GL_GTool
он в среде именуется GL_GTools
карма: 1

0
11
Сообщение
...
Прикрепленные файлы
(файлы не залиты)