Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вот решил поделится открытием :), Вращение 3D объектов 
:(
    Опции темы
cardinal
Дата 29.4.2004, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 5
Всего: 99



Блин... Пишу это сообщение второй раз потому, что мой компер ёкнулся sad.gif...

Вот решил поделится: до меня наконец-то доперло как повернуть объект вокруг "наклонённой оси". Как поворачивать объекты вокруг x, y и z осей я давно уже научился, а вот как поворачивать объект вокруг "наклонённой оси" я чего-то понять не мог. А тут понял. Как всегда все прочто, когда знаешь как smile.gif. Надо просто повернуть объект на угол i вокруг оси y (i меняется в цикле), ну а потом поворачивать вокруг осей x и y, например, на определенный угол. Получается как бы вращение вокруг "наклоненной оси" smile.gif.

У меня была уже давно нарисована сфера средствами VB (и немного математики smile.gif). Нарисована она из точек. Когда она вращается, то видно, что это не 2D, а 3D объект. Вот вам screenshot. Можете поделится своими мнениями smile.gif

Присоединённый файл ( Кол-во скачиваний: 214 )
Присоединённый файл  sphere.jpg


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Georg4
Дата 29.4.2004, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 961
Регистрация: 2.11.2002

Репутация: нет
Всего: 10



нУ и откровения блин посещаютsmile.gif
Это ты на чем делал?
Я на делфи это делал и очень долго думал что вращается объект, окатывается вункция вращает не объект а камеруsmile.gif



--------------------
Никто и никогда не должен решать одну проблему дважды
PM MAIL ICQ   Вверх
cardinal
Дата 30.4.2004, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 5
Всего: 99



Цитата
нУ и откровения блин посещают

да бывает у меня... biggrin.gif
Цитата
Это ты на чем делал?

Все сделано чисто на VB. Никаких камер и всяких там DirectX, OpenGL'ов. Все функции написал сам. Правда прикольно? smile.gif


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
foRaver
Дата 30.4.2004, 03:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 561
Регистрация: 6.7.2003
Где: Düsseldorf

Репутация: нет
Всего: 3



А можешь поделиться примерами кода в учебных целяx, если это конечно не затрудняет, пожалуйста ?
PM MAIL WWW ICQ YIM   Вверх
Secandr
Дата 30.4.2004, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: нет
Всего: 39



шиза, я помнится на паскале такие трёхмерные объекты рисовал, правда до анимации дело не доходило smile.gif


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
cardinal
Дата 30.4.2004, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 5
Всего: 99



Secandr, рисовать - это одно, а вот анимация - это даааа... smile.gif
Цитата
А можешь поделиться примерами кода в учебных целяx, если это конечно не затрудняет, пожалуйста ?

Конечно могу, только вот кину я это прямо сюда, т.к. так как все там понаписано показывать кому стыдно smile.gif. Мне главное было добиться результата, а вылизыванием кода и оптимизацией я пока не занимался.


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
cardinal
Дата 30.4.2004, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 5
Всего: 99



Ввел понятия точка
Код
Public Type Point3D     ' 3D Point
   X As Single
   Y As Single
   Z As Single
End Type

и объект
Код
Public Type Object3D        ' 3D car Object
   pointCol() As Point3D   ' points of the object
   ObjCol() As PObject3D   ' other Objects
   objectsq As Integer ' quantity of PObjects
   pointsq As Integer  ' quantity of points
   enlarge As Single   ' enlarge factor
   center As Point3D   ' center point
End Type

Открыл справочник по математике Корна и написал процедуру, которая мне create'ует сфера из точек.
Код
Public Function CreatePointSphere(Radius As Single, _
                                 center As Point3D _
                                 ) As Object3D
Dim j As Integer            ' counter
Dim k As Integer            ' counter
Dim oldcenter As Point3D    ' copy of the center point
Dim point As Point3D        ' current point
Dim pnum As Integer         ' number of the point
Dim sphere As Object3D      ' new object

' we do not need enlarge factor for this object

' first point is above the center
point.X = center.X
point.Y = center.Y + Radius
point.Z = center.Z + Radius

oldcenter = center      ' copy of center
sphere.pointsq = 683    ' number of points
ReDim sphere.pointCol(sphere.pointsq)
For j = 10 To 190 Step 10
   point = RotateZ(point, center, 10)
   center.Y = point.Y
   For k = 0 To 350 Step 10
       sphere.pointCol(pnum) = point
       pnum = pnum + 1
       point = RotateY(point, center, 10)
   Next
   center.Y = oldcenter.Y
Next
       
'sphere.enlarge =1
sphere.center = oldcenter   ' set the center point
CreatePointSphere = sphere    ' return an object
End Function

Написал процедуры для вращения точек! на такой-то угол по отношению к такой-то оси, координаты которой нам дает точка center.
Код
'**************************************************************************'
'                                                                          '
'                      DIFFERENT ROTATION FUNCTIONS                        '
'                                                                          '
'**************************************************************************'

'**************************************************************************'
' simple rotation around X axis

Public Function RotateX(point As Point3D, _
                       center As Point3D, _
                       Angle As Double _
                       ) As Point3D
Dim newpoint As Point3D

Angle = Angle * PI / 180
point.X = point.X - center.X
point.Y = point.Y - center.Y
point.Z = point.Z - center.Z

newpoint.Y = point.Y * Cos(Angle) - point.Z * Sin(Angle)
newpoint.Z = point.Y * Sin(Angle) + point.Z * Cos(Angle)

newpoint.X = newpoint.X + center.X
newpoint.Y = newpoint.Y + center.Y
newpoint.Z = newpoint.Z + center.Z
RotateX = newpoint
End Function

'**************************************************************************'
' simple rotation around Y axis

Public Function RotateY(point As Point3D, _
                       center As Point3D, _
                       Angle As Double _
                       ) As Point3D
Dim newpoint As Point3D
Angle = Angle * PI / 180
point.X = point.X - center.X
point.Y = point.Y - center.Y
point.Z = point.Z - center.Z

newpoint.X = point.X * Cos(Angle) + point.Z * Sin(Angle)
newpoint.Z = point.Z * Cos(Angle) - point.X * Sin(Angle)

newpoint.X = newpoint.X + center.X
newpoint.Y = newpoint.Y + center.Y
newpoint.Z = newpoint.Z + center.Z
RotateY = newpoint
End Function

'**************************************************************************'
' simple rotation around Z axis

Public Function RotateZ(point As Point3D, _
                       center As Point3D, _
                       Angle As Double _
                       ) As Point3D
Dim newpoint As Point3D
Angle = Angle * PI / 180
point.X = point.X - center.X
point.Y = point.Y - center.Y
point.Z = point.Z - center.Z

newpoint.X = point.X * Cos(Angle) - point.Y * Sin(Angle)
newpoint.Y = point.X * Sin(Angle) + point.Y * Cos(Angle)

newpoint.X = newpoint.X + center.X
newpoint.Y = newpoint.Y + center.Y
newpoint.Z = newpoint.Z + center.Z
RotateZ = newpoint
End Function

Потом есть процедура вращения всех точек объекта вокруг такой-то оси.
Код
'**************************************************************************'
' simple rotation around one axis

Public Function RotateObject(object As Object3D, _
                            angleX As Double, _
                            angleY As Double, _
                            angleZ As Double _
                            ) As Object3D
Dim newcenter As Point3D
Dim i As Integer
newcenter = object.center

' rotate around X axis
If (angleX) Then
   For i = 0 To object.pointsq
       newcenter.X = object.pointCol(i).X
       object.pointCol(i) = RotateX(object.pointCol(i), newcenter, angleX * 1)
       DoEvents
   Next
End If

' rotate around Y axis
If (angleY) Then
   For i = 0 To object.pointsq
      newcenter.Y = object.pointCol(i).Y
      object.pointCol(i) = RotateY(object.pointCol(i), newcenter, angleY * 1)
      DoEvents
   Next
End If

' rotate around Z axis
If (angleZ) Then
   For i = 0 To object.pointsq
       newcenter.Z = object.pointCol(i).Z
       object.pointCol(i) = RotateZ(object.pointCol(i), newcenter, angleZ * 1)
       DoEvents
   Next
End If

RotateObject = object

End Function

Вот так выглядит потом обработка нажатия Command1:
Код
Private Sub Command1_Click()
Dim center As Point3D
Dim i As Double
Dim sphere2 As Object3D
Dim sphere3 As Object3D

Line (5928, 3500)-(9348, 8688), RGB(0, 0, 255)

DrawWidth = 5   ' Set DrawWidth.
Form1.PSet (6732, 4692), RGB(0, 255, 0)
Form1.PSet (8604, 7572), RGB(0, 255, 0)
DrawWidth = 1   ' Set DrawWidth.

center.X = Screen.Width / 2
center.Y = Screen.Height / 2
center.Z = 2500

sphere = CreatePointSphere(2140, center)
sphere2 = sphere
sphere3 = sphere

Do While True
   For i = 0 To 89 Step 1
       sphere3 = sphere
       sphere = sphere2
       RotateObject3D sphere, 0, i, 0
       RotateObject3D sphere, -47, 0, 0
       RotateObject3D sphere, 0, -37, 0
       DrawObject3D sphere
       DeleteObject3D sphere3
       Sleep 50
   Next
Loop
End Sub

Использовались также процедуры:
Код
Public Function DrawObject3D(object As Object3D)
Dim j As Integer

For j = 0 To object.pointsq
   DrawPoint object.pointCol(j), 2
Next

End Function

Код
Public Function DeleteObject3D(object As Object3D)
Dim j As Integer
For j = 0 To object.pointsq
   DrawPoint object.pointCol(j), Form1.BackColor
Next
End Function

Код
Public Function DrawPoint(point As Point3D, color As Long)
Form1.PSet (point.X, point.Y), color
End Function

Может чего-то я и забыл.

Вобщем как уже сказал тут еще до фига всего над чем можно поработать, но так принцип понятен.
Весь проект пока не хочу делать public потому, что "идет стройка". Может когда нибудь сделаю короткий проект и засуну его в FAQ, но пока такого не намечается.


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
maxim1000
Дата 30.4.2004, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



насколько я понял, тут происходит сначала поворот на нужный угол, а потом - "установка" объекта вдоль прямой
а если нужно просто повернуть объект вокруг прямой, что нужно сначала поворачивать его так, чтобы установить на ось, потом вращать, а потом поворачивать назад?
если да, то есть алгоритм проще, если чего-то недопонял - звиняйте...


--------------------
qqq
PM WWW   Вверх
cardinal
Дата 30.4.2004, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 5
Всего: 99



Цитата
а если нужно просто повернуть объект вокруг прямой, что нужно сначала поворачивать его так, чтобы установить на ось, потом вращать, а потом поворачивать назад?

это в смысле если объект повернут? и нам надо его крутить вокруг определенной линии? если так, то получается как раз то что ты сказал. А сейчас у меня происходит след.
Цитата
Надо просто повернуть объект на угол i вокруг оси y (i меняется в цикле), ну а потом поворачивать вокруг осей x и y, например, на определенный угол. Получается как бы вращение вокруг "наклоненной оси" .

как уже говорил.



--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
GoodBoy
Дата 30.4.2004, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Главный джедай
****


Профиль
Группа: Модератор
Сообщений: 3886
Регистрация: 8.1.2003
Где: КМВ

Репутация: нет
Всего: 83



А у нас в универе по компьютерной графике лаба была - вращается трехмерный куб, а в некоторой точке экрана источник света. И куб, кроме того, что произвольно вращается еще и освещается по законам физики, в зависимости от угла падения света на его грань - ярче или тусклее...
Да, и писали это на Паскале, безо всяких Опенов и Директов... :-))))))))))))))))))

З.Ы. А вам слабо? :-))))))))))))))))))))))))))))))

Это сообщение отредактировал(а) GoodBoy - 30.4.2004, 14:06


--------------------
Чем дальше в лес, тем толще партизаны...

Цитата(igorold @  1.5.2016,  17:40 Найти цитируемый пост)
Индейцы не обратили внимания на поток беженцев из Европы… Теперь они живут в резервациях. 
PM MAIL   Вверх
cardinal
Дата 30.4.2004, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 5
Всего: 99



Конечно же не слабо smile.gif, только вот проектом на VB я решил занятся. Сейчас будет побольше свободного времени и я буду над ним работать. Кому интересно смотрите здесь:
http://forum.vingrad.ru/index.php?showforum=61


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
maxim1000
Дата 30.4.2004, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



Цитата
это в смысле если объект повернут? и нам надо его крутить вокруг определенной линии? если так, то получается как раз то что ты сказал. А сейчас у меня происходит след.

тогда можно предложить что-нибудь вроде такого:
есть прямая a, точка A, нужно повернуть точку A на угол alpha вокруг прямой a
1. находим точку B - проекция A на прямую
2. берем вектор x=BA (его мы и будем поворачивать)
3. берем вектор y, перпендикулярный x и a (например, с помощью векторного произведения) и умножаем на такую константу, чтобы по длине он был как x
4. делаем новый вектор z=x*cos(alpha)+y*sin(alpha) - это и есть нужный вектор BC, где C - искомая точка

насчет реализации:
пусть прямая задана одной из своих точек (O) и нормированным направляющим вектором ®
[*,*] - векторное произведение
x=[r , A-O]
B=A-x
y=[r , x]
z=x*cos(alpha)+y*sin(alpha)
C=B+z

Это сообщение отредактировал(а) maxim1000 - 30.4.2004, 15:47


--------------------
qqq
PM WWW   Вверх
cardinal
Дата 30.4.2004, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 5
Всего: 99



хмм... интересно. Надо будет подумать, но не сейчас smile.gif


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
javastic
Дата 6.10.2005, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1214
Регистрация: 18.3.2005
Где: St.Petersburg

Репутация: нет
Всего: 27



Цитата(cardinal @ 29.4.2004, 23:10)
Блин... Пишу это сообщение второй раз потому, что мой компер ёкнулся smile...

Вот решил поделится: до меня наконец-то доперло как повернуть объект вокруг "наклонённой оси". Как поворачивать объекты вокруг x, y и z осей я давно уже научился, а вот как поворачивать объект вокруг "наклонённой оси" я чего-то понять не мог. А тут понял. Как всегда все прочто, когда знаешь как smile. Надо просто повернуть объект на угол i вокруг оси y (i меняется в цикле), ну а потом поворачивать вокруг осей x и y, например, на определенный угол. Получается как бы вращение вокруг "наклоненной оси" smile.

У меня была уже давно нарисована сфера средствами VB (и немного математики smile). Нарисована она из точек. Когда она вращается, то видно, что это не 2D, а 3D объект. Вот вам screenshot. Можете поделится своими мнениями smile

Круто! Молодец. Люблю людей которые добиваются всего сами.
smile


--------------------
01101010 01100001 01110110 01100001 01110011 01110100 01101001 01100011
scjp, mcp 
PM MAIL WWW ICQ   Вверх
cardinal
Дата 6.10.2005, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 5
Всего: 99



Да, было дело... smile

И как народ на такие старые темы натыкается только? smile


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.1199 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.