forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   НУ СРОЧНО НУЖНА ПОМОЩЬ! (http://forum.boolean.name/showthread.php?t=101)

KRIK 20.09.2005 13:58

alcoSHoLiK Ну зачем, просто качай ссылку которую выложил

SubZer0 ТАМ ВСЕ ФАЙЛЫ :super:

И кстати БОЛЬШОЕ СПАСИБО SubZer0 :)) !!!

KRIK 20.09.2005 14:37

Да :glag: я наверно вас уже достал, но у меня есть ещё несколько вопросов:

1.Почему когда я отважу дальше камеру ( НА КОЛЁСИКО ) всё становится вытенутым, каким-то кривым???Можно ли от этого избавиться???

2.Можно ли сделать так, чтобы когда мой герой убегал к примеру на 10 (метров образна говоря) от кубиков их имена(кубиков) изчезали???

3.И можно ли сделать так, чтобы имена кубиков были написанны на чёрном(тёмном) прозрачном фоне(по размеру с сомо имя)???

:SOS: :SOS: :SOS:

SubZer0 20.09.2005 15:00

Цитата:

Originally posted by xxxKRIKxxx@Sep 20 2005, 12:37 PM
Да :glag: я наверно вас уже достал, но у меня есть ещё несколько вопросов:

1.Почему когда я отважу дальше камеру ( НА КОЛЁСИКО ) всё становится вытенутым, каким-то кривым???Можно ли от этого избавиться???

2.Можно ли сделать так, чтобы когда мой герой убегал к примеру на 10 (метров образна говоря) от кубиков их имена(кубиков) изчезали???

3.И можно ли сделать так, чтобы имена кубиков были написанны на чёрном(тёмном) прозрачном фоне(по размеру с сомо имя)???

:SOS: :SOS: :SOS:

Нет, еще нет, и не сможешь, мы тут для этого и форум замутили... B)

на счет первого:

помоему (насколько я помню) это все называется перспективным просмотром, оно и в нормальном состоянии кубик смотрится не как кубик а как паралелограмм, что и придает трехмерность изображению, что если взять кубик и отнести его маленько влево, то мы увидим правый бок, а если маленько вправо то левый...

лично я советую Зумом только приближать чтото, типа в бинокль смотришь, а на счет отдаления, тут лучше позицию самой камеры менять, а иначе все получается как через увеличительное стекло...

на счет второго: есть теорема пифагора (покажу на моем старом примере)
Код:

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


на счет третьего:

чесно сказать никогда не пробовал, но первое что пришло в голову, юзать свой графический шрифт, или просто просчитывать и рисовать сначала квадратик (прямоугольник) фона а потом на нем текст..

;) ;) ;)

Жека 20.09.2005 15:04

1. побочные эффекты масштабирования, наверное...
Исправить не знаю как.

2. проверяй расстояние от героя (или камеры) до кубиков. Если оно стало БОЛЬШЕ 10 (или любого другого НУЖНОГО значения), то НЕ выводи имена.
То же самое, но по-другому: выводи имена ТОЛЬКО если кубики БЛИЖЕ заданной дистанции.

3. Можно использовать библиотеку для рисования полупрозрачных рисунков + шрифт-картинку... (2д вариант)
Или сделать картинки с именами объектов и натянуть их на спрайты, и сделать спрайты полупрозрачными, + масштабировать спрайты в зависимости от длины имени, + сделать их "детьми" для соответствующих кубиков (3д вариант).

Второй вариант проще сделать. Или нет? Сам-то я пока не делал такое, но должно работать.
2 должен быть быстрее, потому что 3д...

Жека 20.09.2005 15:10

Насчет первого SubZer0 правильно сказал, я-то думал там что-то сверхестественное творится.

Рисовать прямоугольник, а сверху текст - самое простое.
Но:
1. как сделать прямоугольник полупрозрачным?
2. команда Text медленно выполняется! Надо иметь это ввиду...

KRIK 20.09.2005 15:31

А ха точно самое главное-то забыл написать. :wallbash:

4.Я тут думал как сделать умную камеру, чтоб камера не опускалась ниже уровня и сквозь стены не прохадила(при тотм если учесть что тур не ровный , а где-то есть впадины, а где-то и высоты) ,но так толком и не чё ни сделал.Я возможно знаю, что вы скажете смотри пример CASTLE вроде он так назывался, но я вас предупреждаю я там ни чё ни понел:wallbash: :wallbash: :wallbash: . :SOS: :SOS:

5.И практически таже проблема с героем(как он прыгает от уровня -7 до уровня 3 по высоте,так и прыгает) как сделадь чтоб он прыгал на +7 по высоте несмотря на то где он находится(В НИЗУ ИЛИ В ВЕРХУ)!!! :wallbash: :SOS: :SOS: :SOS:

Жека 20.09.2005 15:48

Чтобы камера, герой и прочие объекты не проходили через другие объекты, нужно назначить для них коллизии.
Если с героем все относительно просто, то с камерой посложнее: может получиться так, что камера "зацепится" за какое-то препятствие, и игрок отдалится от нее (или приблизится). Поэтому необходимо следить за расстоянием от героя до камеры, и если оно не равно какому-то эталонному, то сделать его таковым.
Неровности: высоту камеры над уровнем земли проверяешь, используя команду LinePick. С ее помощью ты получишь координату Y (x,z) "над" камерой, т.е. высоту холма (впадины). Затем проверяешь расстояние от найденной высоты до камеры, если больше эталонного, то уменьшаешь (двигаешь камеру вниз), меньше - увеличиваешь.

Прыгать надо не от координаты, а от поверхности земли, тогда прыжок будет одинаковый по высоте.

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

..::SERGO::.. 20.09.2005 16:39

Наверно ща напишу бред :dontknow: но все таки :glag: (просто хотелось высказатьза за пару дней)
Ето чтобы текс уберался :rolleyes:
:o'' if entitydistance(pl,NPC) > 10 then ClearAllActions :o''
или что-то в етом духе :))

Жека 20.09.2005 17:08

так ты что, два дня молчал что ли? :)

Типа псевдокода, но ты выбрал первый вариант. Я же НАСТОЯТЕЛЬНО советую делать по второму, т.е. именно если МЕНЬШЕ

if (entitydistance(hero,NPC)<MAX_RANGE)
;берем проекцию объекта на камеру
;выводим текст в полученных координатах
;это 2д

;для 3д
;showentity sprite_name_npc или
;entityvisible sprite_name_npc
;масштабируем спрайт в зависимости от расстояния до камеры (чтобы он
;не получился слишком маленьким либо слишком большим)
endif

KRIK 20.09.2005 18:11

Цитата:

Чтобы камера, герой и прочие объекты не проходили через другие объекты, нужно назначить для них коллизии.
Если с героем все относительно просто, то с камерой посложнее: может получиться так, что камера "зацепится" за какое-то препятствие, и игрок отдалится от нее (или приблизится). Поэтому необходимо следить за расстоянием от героя до камеры, и если оно не равно какому-то эталонному, то сделать его таковым.
Неровности: высоту камеры над уровнем земли проверяешь, используя команду LinePick. С ее помощью ты получишь координату Y (x,z) "над" камерой, т.е. высоту холма (впадины). Затем проверяешь расстояние от найденной высоты до камеры, если больше эталонного, то уменьшаешь (двигаешь камеру вниз), меньше - увеличиваешь.

Прыгать надо не от координаты, а от поверхности земли, тогда прыжок будет одинаковый по высоте.


Жека! или КТО-НИБУДЬ! Напешите элементарный примерчик ПОЖАЙЛУСТА,а то я примерно знаю чё делать, а чё точно не имею понятия, ну на примере лучше я въезжаю,а не на словах!

Жека 20.09.2005 20:19

Вложений: 1
Вобщем, я написал пример, часть взял из того, что выложил SubZer0.
Придется тебе его переделать под свои нужды, у меня времени нет, проще и быстрее было сделать то, что я сделал...
Комментарии я проставил. Не очень подробные, но все же.
Если что не понятно, спрашивай.


Фичи:
-робот не проходит сквозь большой кубик
-робот не проходит сквозь землю
-камера не проходит сквозь землю
-камера не проходит через большой кубик
-имена кубиков пишутся, если расстояние от них до робота меньше 100
-имена кубиков пишутся, если есть прямая видимость между ними и роботом (добавил преграду для видимости - большой куб, земля как преграда была до меня)

SubZer0 20.09.2005 20:42

Цитата:

Originally posted by SERGO@Sep 20 2005, 02:39 PM
Наверно ща напишу бред :dontknow: но все таки :glag: (просто хотелось высказатьза за пару дней)
Ето чтобы текс уберался :rolleyes:
:o'' if entitydistance(pl,NPC) > 10 then ClearAllActions :o''
или что-то в етом духе :))

Опс.... сорри, я и забыл, что есть такая команда... еще раз приношу извинения... :sorry: :sorry: :sorry:

Жека 20.09.2005 21:57

SubZer0, все ты правильно написал, осталось только запихнуть теорему в функцию и назвать ее EntityDistance ;)
Но твой вариант более общий, так как позволяет считать в любой из плоскостей, в 3д или по отдельной оси.
Ведь бывают случаи, когда надо посчитать расстояние только в плоскости XOZ, для этого из твоего кода убираем yd и все!
А "ентитидистанс" не упростить....

jimon 20.09.2005 22:28

хочу заметить что entitydistance тормозит иногда :o''

Diplomat 20.09.2005 22:31

Однако ж практика показывает, что "встроенный" ЁнтитиДистанс работает на порядок (!) быстрее, чем расчет из кода через теорему Пифагора. Так что при необходимости расчитать дистанцию между двумя обьектами по проекциям на плоскости, логично использовать дополнительный пивот, размещаемый по законам проекции одного обьекта на одной плоскости со вторым...


Часовой пояс GMT +4, время: 06:15.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot