|
3D-программирование Вопросы, касающиеся программирования 3D мира |
23.12.2009, 10:35
|
#1
|
Нуждающийся
Регистрация: 07.02.2009
Сообщений: 92
Написано 16 полезных сообщений (для 38 пользователей)
|
поворот объекта на объект
Function createquad()
quad=CreateMesh()
surf=CreateSurface(quad)
v1=AddVertex(surf,0,5,0)
v2=AddVertex(surf,0,-5,0)
v3=AddVertex(surf,40,5,0)
v4=AddVertex(surf,40,-5,0)
AddTriangle(surf,v1,v3,v4)
AddTriangle(surf,v1,v4,v2)
RotateMesh quad,90,0,0
EntityColor quad,0,0,0
Return quad
End Function
Function obzor(cam)
If KeyDown(31) Then MoveEntity cam,0,0,-temp
If KeyDown(17) Then MoveEntity cam,0,0,temp
If KeyDown(30) Then MoveEntity cam,-temp,0,0
If KeyDown(32) Then MoveEntity cam,temp,0,0
xm=MouseXSpeed()
ym=MouseYSpeed()
MoveMouse 400,300
TurnEntity cam,ym*mouse,-xm*mouse,0
End Function
Function update(cam,mesh1,mesh2,mesh3)
RotateEntity mesh1,0,-(ATan2(EntityX(cam,1)-EntityX(mesh1,1),EntityZ(cam,1)-EntityZ(mesh1,1)))+90,270,1
RotateEntity mesh2,-(ATan2(EntityY(cam,1)-EntityY(mesh2,1),EntityZ(cam,1)-EntityZ(mesh2,1)))+90,0,0,1
End Function
Graphics3D 800,600,0,0
Global mouse#=.1,temp#=.5
w1=createquad()
PositionEntity w1,-7,0,0
w2=createquad()
PositionEntity w2,0,0,7
cam=CreateCamera()
CameraClsColor cam,255,255,255
PositionEntity cam,0,2,-10
Repeat
obzor cam
update cam,w1,w2,w3
RenderWorld
UpdateWorld
Flip()
Until KeyHit(1)
End
|
Два прямоугольника поворачиваются к камере вокруг своей локальной оси. А как сделать, чтобы эту ось можно было изменять, т. е. при любом повороте объекта он остался повернут своей полной видимой стороной к камере, и поворачивался по своей локальной, той же оси.
Я что-то не могу понять как это сделать.
|
(Offline)
|
|
23.12.2009, 11:21
|
#2
|
Задрот
Регистрация: 24.07.2009
Адрес: Ивановская область, г. Кинешма
Сообщений: 1,574
Написано 407 полезных сообщений (для 863 пользователей)
|
Ответ: поворот объекта на объект
гм... EntityYaw and EntityPitch and EntityRoll тебе в помощь, PointEntity
|
(Offline)
|
|
23.12.2009, 16:40
|
#3
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Ответ: поворот объекта на объект
Угу, поворачивай свои объекты на углы положения камеры,
находя их через команды предоставленные выше.
|
(Offline)
|
|
24.12.2009, 14:49
|
#4
|
Нуждающийся
Регистрация: 07.02.2009
Сообщений: 92
Написано 16 полезных сообщений (для 38 пользователей)
|
Ответ: поворот объекта на объект
Угу, поворачивай свои объекты на углы положения камеры,
|
Так спрайты делаются,но для моего случая такой способ не подходит
Но я решил проблему:
1)создаю пивот у объекта
2)припаренчиваю камеру к пивоту
3)поворачиваю пивот на угол, отрицательный углам объекта
4)высчитываю угол поворота объекта по формуле (в коде выше, функция-update)
5)возвращаю камеру на место и отпаренчиваю от пивота
6)удаляю пивот
|
(Offline)
|
|
02.01.2010, 11:06
|
#5
|
Разработчик
Регистрация: 02.04.2007
Сообщений: 353
Написано 54 полезных сообщений (для 289 пользователей)
|
Ответ: поворот объекта на объект
чет метод чрезжопный какой то )))
|
(Offline)
|
|
02.01.2010, 14:49
|
#6
|
Гигант индустрии
Регистрация: 13.09.2008
Сообщений: 2,893
Написано 1,185 полезных сообщений (для 3,298 пользователей)
|
Ответ: поворот объекта на объект
Может быть стоит использовать функцию HolyDel'a (CurvePointEntity)?
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
02.01.2010, 16:12
|
#7
|
Задрот
Регистрация: 24.07.2009
Адрес: Ивановская область, г. Кинешма
Сообщений: 1,574
Написано 407 полезных сообщений (для 863 пользователей)
|
Ответ: поворот объекта на объект
Вот пока здесь спрошу....
В ообщем, в справке написано, что команда PointEntity(Entity1,Entity2,Angle#) направляет Entity1 на Entity2. Причем, если величина Angle# не указана, поворот осуществляется мгновенно, иначе поворачивает на Angle# за один шаг. Но, как я ни пробовал, выставлял Angle от 1 до .0001, Entity1 всегда направлялось мгновенно! Что же я делаю не так???
|
(Offline)
|
|
02.01.2010, 16:20
|
#8
|
злобный флудер
Регистрация: 10.07.2007
Сообщений: 2,585
Написано 789 полезных сообщений (для 1,476 пользователей)
|
Ответ: поворот объекта на объект
entity - entity handle
target - target entity handle
roll# (optional) - roll angle of entity
Description
Points one entity at another.
The optional roll parameter allows you to specify a roll angle as pointing an entity only sets pitch and yaw angles.
If you wish for an entity to point at a certain position rather than another entity, simply create a pivot entity at your desired position, point the entity at this and then free the pivot.
|
(Offline)
|
|
02.01.2010, 16:45
|
#9
|
Задрот
Регистрация: 24.07.2009
Адрес: Ивановская область, г. Кинешма
Сообщений: 1,574
Написано 407 полезных сообщений (для 863 пользователей)
|
Ответ: поворот объекта на объект
Nite, справка и у меня есть, даже русская И там таккже все написано, а толку от этого Roll# никакого. Так все же знает кто как делать правильно?
|
(Offline)
|
|
02.01.2010, 21:41
|
#10
|
Бывалый
Регистрация: 03.11.2008
Адрес: Украина, Днепропетровск
Сообщений: 871
Написано 554 полезных сообщений (для 2,520 пользователей)
|
Ответ: поворот объекта на объект
Если я правильно понял, тебе нужно это:
Function SmoothPointEntity(e1,e2,smothness#=100.0,smeshen#=0)
PositionEntity gPivot1,EntityX(e1),EntityY(e1)+smeshen,EntityZ(e1)
PointEntity gPivot1,e2
RotateEntity e1, 0,curveAngle#(EntityYaw(gPivot1),EntityYaw(e1),smothness#),0
End Function
Function CurveAngle#(newangle#,oldangle#,increments#)
If increments>1
If (oldangle+360)-newangle<newangle-oldangle
oldangle=360+oldangle
End If
If (newangle+360)-oldangle<oldangle-newangle
newangle=360+newangle
End If
oldangle=oldangle-(oldangle-newangle)/increments
End If
If increments<=1
Return newangle
End If
Return oldangle
End Function
|
(Offline)
|
|
02.01.2010, 22:16
|
#11
|
Задрот
Регистрация: 24.07.2009
Адрес: Ивановская область, г. Кинешма
Сообщений: 1,574
Написано 407 полезных сообщений (для 863 пользователей)
|
Ответ: поворот объекта на объект
Harter, если бы мне нужен был код, я бы его сам написал, но, мне было интересно умеет ли PiontEntity работать как мне надо
ЗЫ EntityYaw() никогда не возвратит значение >360 и <0, => в функции CurveAngle() можно проверку отключить...
|
(Offline)
|
|
02.01.2010, 22:39
|
#12
|
злобный флудер
Регистрация: 10.07.2007
Сообщений: 2,585
Написано 789 полезных сообщений (для 1,476 пользователей)
|
Ответ: поворот объекта на объект
Вот пока здесь спрошу....
В ообщем, в справке написано, что команда PointEntity(Entity1,Entity2,Angle#) направляет Entity1 на Entity2. Причем, если величина Angle# не указана, поворот осуществляется мгновенно, иначе поворачивает на Angle# за один шаг. Но, как я ни пробовал, выставлял Angle от 1 до .0001, Entity1 всегда направлялось мгновенно! Что же я делаю не так???
|
это бред.
Nite, справка и у меня есть, даже русская И там таккже все написано, а толку от этого Roll# никакого. Так все же знает кто как делать правильно?
|
это в купе с постами №7 и 8 ещё больший бред.
Harter, если бы мне нужен был код, я бы его сам написал, но, мне было интересно умеет ли PiontEntity работать как мне надо
|
нет не умеет. пиши код сам.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо NitE за это полезное сообщение:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:57.
|