|
3D-программирование Вопросы, касающиеся программирования 3D мира |
20.09.2005, 13:58
|
#16
|
Бывалый
Регистрация: 19.09.2005
Сообщений: 649
Написано 3 полезных сообщений (для 3 пользователей)
|
alcoSHoLiK Ну зачем, просто качай ссылку которую выложил
SubZer0 ТАМ ВСЕ ФАЙЛЫ
И кстати БОЛЬШОЕ СПАСИБО SubZer0 )
|
(Offline)
|
|
20.09.2005, 14:37
|
#17
|
Бывалый
Регистрация: 19.09.2005
Сообщений: 649
Написано 3 полезных сообщений (для 3 пользователей)
|
Да я наверно вас уже достал, но у меня есть ещё несколько вопросов:
1.Почему когда я отважу дальше камеру ( НА КОЛЁСИКО ) всё становится вытенутым, каким-то кривым???Можно ли от этого избавиться???
2.Можно ли сделать так, чтобы когда мой герой убегал к примеру на 10 (метров образна говоря) от кубиков их имена(кубиков) изчезали???
3.И можно ли сделать так, чтобы имена кубиков были написанны на чёрном(тёмном) прозрачном фоне(по размеру с сомо имя)???
|
(Offline)
|
|
20.09.2005, 15:00
|
#18
|
Администратор
Регистрация: 03.09.2005
Сообщений: 2,408
Написано 301 полезных сообщений (для 996 пользователей)
|
Originally posted by xxxKRIKxxx@Sep 20 2005, 12:37 PM
Да я наверно вас уже достал, но у меня есть ещё несколько вопросов:
1.Почему когда я отважу дальше камеру ( НА КОЛЁСИКО ) всё становится вытенутым, каким-то кривым???Можно ли от этого избавиться???
2.Можно ли сделать так, чтобы когда мой герой убегал к примеру на 10 (метров образна говоря) от кубиков их имена(кубиков) изчезали???
3.И можно ли сделать так, чтобы имена кубиков были написанны на чёрном(тёмном) прозрачном фоне(по размеру с сомо имя)???
|
Нет, еще нет, и не сможешь, мы тут для этого и форум замутили...
на счет первого:
помоему (насколько я помню) это все называется перспективным просмотром, оно и в нормальном состоянии кубик смотрится не как кубик а как паралелограмм, что и придает трехмерность изображению, что если взять кубик и отнести его маленько влево, то мы увидим правый бок, а если маленько вправо то левый...
лично я советую Зумом только приближать чтото, типа в бинокль смотришь, а на счет отдаления, тут лучше позицию самой камеры менять, а иначе все получается как через увеличительное стекло...
на счет второго: есть теорема пифагора (покажу на моем старом примере)
graphics3d 800,600,32,2
setbuffer backbuffer()
camera=createcamera()
positionentity camera,0,20,-50
rotateentity createlight(),0,20,40
cube=createcube()
positionentity cube,0,0,20
scaleentity cube,5,10,5
entitypickmode cube,2
player= CreateCube()
entitycolor player,50,250,50
scaleentity player,3,3,3
entitypickmode player,2
viewer = CreateSphere()
positionentity viewer,0,16,-45
repeat
Pickentity=linepick(EntityX(viewer),EntityY(viewer),EntityZ(viewer), EntityX(player)-EntityX(viewer),EntityY(player)-EntityY(viewer),EntityZ(player)-EntityZ(viewer))
px#=0
py#=0
if EntityInView(player,camera) And Pickentity=player
cameraproject(camera,EntityX(player),EntityY(player),EntityZ(player))
px=ProjectedX()
py=ProjectedY()
endif
if KeyDown(200) Then TranslateEntity player,0,0,1
if KeyDown(208) Then TranslateEntity player,0,0,-1
if KeyDown(205) Then TranslateEntity player,1,0,0
if KeyDown(203) Then TranslateEntity player,-1,0,0
renderworld
; вычисляем расстояние по теореме пифагора
xd=abs(EntityX(player)-EntityX(viewer))
yd=abs(EntityY(player)-EntityY(viewer))
zd=abs(EntityZ(player)-EntityZ(viewer))
r=Sqr(xd*xd+yd*yd+zd*zd)
; проверяем, если оно меньше 200 то показываем имя
if r<200
if px or py Then
Color 255,0,0
Text px,py,"Player"
Color 255,255,255
endif
endif
flip
until KeyHit(1)
end
на счет третьего:
чесно сказать никогда не пробовал, но первое что пришло в голову, юзать свой графический шрифт, или просто просчитывать и рисовать сначала квадратик (прямоугольник) фона а потом на нем текст..
__________________
Как минимум я помог многим (с)
|
(Offline)
|
|
20.09.2005, 15:04
|
#19
|
Дэвелопер
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений (для 886 пользователей)
|
1. побочные эффекты масштабирования, наверное...
Исправить не знаю как.
2. проверяй расстояние от героя (или камеры) до кубиков. Если оно стало БОЛЬШЕ 10 (или любого другого НУЖНОГО значения), то НЕ выводи имена.
То же самое, но по-другому: выводи имена ТОЛЬКО если кубики БЛИЖЕ заданной дистанции.
3. Можно использовать библиотеку для рисования полупрозрачных рисунков + шрифт-картинку... (2д вариант)
Или сделать картинки с именами объектов и натянуть их на спрайты, и сделать спрайты полупрозрачными, + масштабировать спрайты в зависимости от длины имени, + сделать их "детьми" для соответствующих кубиков (3д вариант).
Второй вариант проще сделать. Или нет? Сам-то я пока не делал такое, но должно работать.
2 должен быть быстрее, потому что 3д...
|
(Offline)
|
|
20.09.2005, 15:10
|
#20
|
Дэвелопер
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений (для 886 пользователей)
|
Насчет первого SubZer0 правильно сказал, я-то думал там что-то сверхестественное творится.
Рисовать прямоугольник, а сверху текст - самое простое.
Но:
1. как сделать прямоугольник полупрозрачным?
2. команда Text медленно выполняется! Надо иметь это ввиду...
|
(Offline)
|
|
20.09.2005, 15:31
|
#21
|
Бывалый
Регистрация: 19.09.2005
Сообщений: 649
Написано 3 полезных сообщений (для 3 пользователей)
|
|
(Offline)
|
|
20.09.2005, 15:48
|
#22
|
Дэвелопер
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений (для 886 пользователей)
|
Чтобы камера, герой и прочие объекты не проходили через другие объекты, нужно назначить для них коллизии.
Если с героем все относительно просто, то с камерой посложнее: может получиться так, что камера "зацепится" за какое-то препятствие, и игрок отдалится от нее (или приблизится). Поэтому необходимо следить за расстоянием от героя до камеры, и если оно не равно какому-то эталонному, то сделать его таковым.
Неровности: высоту камеры над уровнем земли проверяешь, используя команду LinePick. С ее помощью ты получишь координату Y (x,z) "над" камерой, т.е. высоту холма (впадины). Затем проверяешь расстояние от найденной высоты до камеры, если больше эталонного, то уменьшаешь (двигаешь камеру вниз), меньше - увеличиваешь.
Прыгать надо не от координаты, а от поверхности земли, тогда прыжок будет одинаковый по высоте.
ПС: извиняюсь, что ни строчки кода не даю. Суть я передал как смог, кто хочет кодом помочь - помогите (сделать все это довольно просто, но новички (без обид) могут и не въехать).
|
(Offline)
|
|
20.09.2005, 16:39
|
#23
|
Знающий
Регистрация: 09.09.2005
Сообщений: 300
Написано 0 полезных сообщений (для 0 пользователей)
|
Наверно ща напишу бред но все таки (просто хотелось высказатьза за пару дней)
Ето чтобы текс уберался
:o'' if entitydistance(pl,NPC) > 10 then ClearAllActions :o''
или что-то в етом духе )
|
(Offline)
|
|
20.09.2005, 17:08
|
#24
|
Дэвелопер
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений (для 886 пользователей)
|
так ты что, два дня молчал что ли?
Типа псевдокода, но ты выбрал первый вариант. Я же НАСТОЯТЕЛЬНО советую делать по второму, т.е. именно если МЕНЬШЕ
if (entitydistance(hero,NPC)<MAX_RANGE)
;берем проекцию объекта на камеру
;выводим текст в полученных координатах
;это 2д
;для 3д
;showentity sprite_name_npc или
;entityvisible sprite_name_npc
;масштабируем спрайт в зависимости от расстояния до камеры (чтобы он
;не получился слишком маленьким либо слишком большим)
endif
|
(Offline)
|
|
20.09.2005, 18:11
|
#25
|
Бывалый
Регистрация: 19.09.2005
Сообщений: 649
Написано 3 полезных сообщений (для 3 пользователей)
|
Чтобы камера, герой и прочие объекты не проходили через другие объекты, нужно назначить для них коллизии.
Если с героем все относительно просто, то с камерой посложнее: может получиться так, что камера "зацепится" за какое-то препятствие, и игрок отдалится от нее (или приблизится). Поэтому необходимо следить за расстоянием от героя до камеры, и если оно не равно какому-то эталонному, то сделать его таковым.
Неровности: высоту камеры над уровнем земли проверяешь, используя команду LinePick. С ее помощью ты получишь координату Y (x,z) "над" камерой, т.е. высоту холма (впадины). Затем проверяешь расстояние от найденной высоты до камеры, если больше эталонного, то уменьшаешь (двигаешь камеру вниз), меньше - увеличиваешь.
Прыгать надо не от координаты, а от поверхности земли, тогда прыжок будет одинаковый по высоте.
|
Жека! или КТО-НИБУДЬ! Напешите элементарный примерчик ПОЖАЙЛУСТА,а то я примерно знаю чё делать, а чё точно не имею понятия, ну на примере лучше я въезжаю,а не на словах!
|
(Offline)
|
|
20.09.2005, 20:19
|
#26
|
Дэвелопер
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений (для 886 пользователей)
|
Вобщем, я написал пример, часть взял из того, что выложил SubZer0.
Придется тебе его переделать под свои нужды, у меня времени нет, проще и быстрее было сделать то, что я сделал...
Комментарии я проставил. Не очень подробные, но все же.
Если что не понятно, спрашивай.
Фичи:
-робот не проходит сквозь большой кубик
-робот не проходит сквозь землю
-камера не проходит сквозь землю
-камера не проходит через большой кубик
-имена кубиков пишутся, если расстояние от них до робота меньше 100
-имена кубиков пишутся, если есть прямая видимость между ними и роботом (добавил преграду для видимости - большой куб, земля как преграда была до меня)
|
(Offline)
|
|
20.09.2005, 20:42
|
#27
|
Администратор
Регистрация: 03.09.2005
Сообщений: 2,408
Написано 301 полезных сообщений (для 996 пользователей)
|
__________________
Как минимум я помог многим (с)
|
(Offline)
|
|
20.09.2005, 21:57
|
#28
|
Дэвелопер
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений (для 886 пользователей)
|
SubZer0, все ты правильно написал, осталось только запихнуть теорему в функцию и назвать ее EntityDistance
Но твой вариант более общий, так как позволяет считать в любой из плоскостей, в 3д или по отдельной оси.
Ведь бывают случаи, когда надо посчитать расстояние только в плоскости XOZ, для этого из твоего кода убираем yd и все!
А "ентитидистанс" не упростить....
|
(Offline)
|
|
20.09.2005, 22:28
|
#29
|
|
хочу заметить что entitydistance тормозит иногда :o''
|
|
|
20.09.2005, 22:31
|
#30
|
Дэвелопер
Регистрация: 07.09.2005
Сообщений: 1,519
Написано 66 полезных сообщений (для 164 пользователей)
|
Однако ж практика показывает, что "встроенный" ЁнтитиДистанс работает на порядок (!) быстрее, чем расчет из кода через теорему Пифагора. Так что при необходимости расчитать дистанцию между двумя обьектами по проекциям на плоскости, логично использовать дополнительный пивот, размещаемый по законам проекции одного обьекта на одной плоскости со вторым...
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:06.
|