IPB

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
Определение точки матрицы под курсором
Sha/|/|an
сообщение 27.9.2004, 16:26
Сообщение #1


Digital Mystery
***

Группа: Пользователи
Сообщений: 1887
Регистрация: 1.9.2004
Пользователь №: 8



Вот функция для определения точки матрицы под курсором:

Код
function mmcoord(object,scrx#,scry#,matnum,msizex#,msizez#,r#,FOV#)
 ax#=camera angle x()
 ay#=camera angle y()
 scrw#=screen width()
 scrh#=screen height()

 hmax# = r#*tan(FOV#/2)
 mh#   = (((scrh#/2-scry#)*2)/scrh#)*hmax#
 wmax# = r#*scrw#/scrh#*tan(FOV#/2)
 mw#   = (((scrx#-scrw#/2)*2)/scrw#)*wmax#

 cl#   = r#*cos(ax#)
 ch#   = (-1*r#)*sin(ax#)

 sl#   = mh#*cos(90-ax#)
 sh#   = mh#*sin(90-ax#)

 ox#    = camera position x() + (cl#+sl#)*sin(ay#) + mw#*cos(ay#)
 oy#    = camera position y() + (ch#+sh#)
 oz#    = camera position z() + (cl#+sl#)*cos(ay#) - mw#*sin(ay#)

 i#=0
  while i#<1
   x# = camera position x() + (ox#-camera position x())*i#
   y# = camera position y() + (oy#-camera position y())*i#
   z# = camera position z() + (oz#-camera position z())*i#
   mpx# = matrix position x(matnum)
   mpz# = matrix position z(matnum)
   mpy# = matrix position y(matnum)

   if x#>=mpx# and x#<=mpx#+msizex# and z#>=mpz# and z#<=mpz#+msizez#
      if y#-mpy#+get ground height(matnum,x#,z#)<=0.0
           position object object, x#,get matrix height(matnum, x#, z#), z#
           exitfunction
     endif
   ENDIF
  i#=i#+(1.0/r#)
 endwhile
endfunction


В этой функции:
  • Object - номер объекта, который ставится под курсор
  • scrx# - Координата курсора по оси X
  • scry# - Координата курсора по оси Y
  • matnum - Номер матрицы, на которой определяются координаты
  • msizex# - Размер матрицы, но которой определяются координаты, по оси X
  • msizez# - Размер матрицы, но которой определяются координаты, по оси Z
  • r# - Дальность рендеринга камеры
  • FOV# - Вроде бы угол обхора камеры, но что это на самом деле так, я не уверен. Я использую значение 60.0.

Надо учитывать, что при использовании этой функции в ДБклассик, все передаваемые значения должны строго соответствовать по типу с объявленными в переменной. Т.е. координаты курсора по оси X и Y должны быть вещественными.

Эту функции можно использовать и в ДБпро, там не обязательно строгое соответствие параметров функции.

Примечание:
При большом удалении точки от камеры (например вид от 1-го лица при большой дистанции обзора камеры) функция начинает тормозить. В ДБпро это не сильно влияет на производительность, но в ДБклассик заметно.


--------------------
exclusive reality for you...
Перейти в начало страницы
 
+Цитировать сообщение
Гость_AbLaZe_*
сообщение 19.6.2005, 12:56
Сообщение #2





Гости






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

Код
#include "units\tools.dba"

REM Ширина, высота и глубина экрана
Width=1024
Height=768
Depth=16

sync rate 0

REM делаем нужное нам разрешение экрана
if check display mode(Width,Height,Depth)=1
set display mode Width, Height, Depth
else
print "Не могу установить разрешение экрана "; Width; " x "; Height;
endif

rem Грузим модель игрока
LOAD OBJECT "data\idle.x",2 : APPEND OBJECT "data\walk.x",2,100
YROTATE OBJECT 2,180 : FIX OBJECT PIVOT 2

rem Устанавливаем анимацию
LOOP OBJECT 2,0,20 : SET OBJECT SPEED 2,10

rem Загружаем игровую панель
load image "data\gamepanel.bmp", 2

rem Создание простой сцены для показа через камеру
make matrix 1,10000.0,10000.0,25,25
load bitmap "data\floor1.bmp",1
get image 1,0,0,256,256
delete bitmap 1
prepare matrix texture 1,1,2,2
randomize matrix 1,150.0

rem делаем случайные возвышенности
for i=1 to 30
set matrix height 1,rnd(25),rnd(25),300.0
next i

update matrix 1

rem Создание объекта для мыши
make object sphere 1,25.0

rem Установка переменных, определяющих положение объекта
x#=500
z#=500

rem Включение ручной синхронизации
sync on

rem Начало цикла
do

rem Отслеживаем мышь и делаем движение указателя
mx=mousex()
my=mousey()

mmcoord(1,mx#,my#,1,10000.0,10000.0,100.0,60.0)

rem Управление камерой клавишами-стрелками
stage=0
if upkey()=1 then x#=newxvalue(x#,a#,10) : z#=newzvalue(z#,a#,10) : stage=1
if downkey()=1 then x#=newxvalue(x#,a#,-10) : z#=newzvalue(z#,a#,-10) : stage=1
if leftkey()=1 then a#=wrapvalue(a#-2.0)
if rightkey()=1 then a#=wrapvalue(a#+2.0)

rem делаем анимацию хотьбы
IF stage<>oldstage
  IF stage=0
     SET OBJECT FRAME 2,0.0
     LOOP OBJECT 2,0,20
     SET OBJECT SPEED 2,10
  ENDIF
  IF stage=1
     SET OBJECT FRAME 2,105.0
     LOOP OBJECT 2,105,125
     SET OBJECT SPEED 2,40
  ENDIF
  oldstage=stage
ENDIF

rem Обновление положения объекта
y#=get ground height(1,x#,z#)+0.0

position object 2,x#,y#,z#
yrotate object 2,a#

rem Размещение камеры позади объекта
cx#=newxvalue(x#,wrapvalue(a#+180),500)
cz#=newzvalue(z#,wrapvalue(a#+180),500)
cy#=get ground height(1,cx#,cz#)+400.0
position camera cx#,cy#,cz#

rem Наведение камеры на объект
point camera x#,y#,z#

rem Вставляем панель !!!
paste image 2,0,0,0

rem выводим FPS
set cursor 150,20
print "FPS: "; screen fps()

rem Синхронизация
sync

rem Конец цикла
loop

end


у меня там бегает человечек по матрице ... и камера за ним летает ...
но двигаю мышью и чет не меняется положение сферы.... и что нужно подставлять под r#

помогите please !!!
Перейти в начало страницы
 
+Цитировать сообщение
dagon-d
сообщение 19.6.2005, 14:00
Сообщение #3


Активный участник
***

Группа: Пользователи
Сообщений: 449
Регистрация: 13.6.2005
Пользователь №: 318



я так понял то что делал через set camera range dry.gif


--------------------
ТВОРЕЦ везде, даже на твоём жёстком диске.
Перейти в начало страницы
 
+Цитировать сообщение
Гость_AbLaZe_*
сообщение 19.6.2005, 14:05
Сообщение #4





Гости






я не делал set camera range
она стоит по умолчанию 1 и 3000


ну помогите мне .... что не так при определении курсора .... он не двигается !!!
Перейти в начало страницы
 
+Цитировать сообщение
Sha/|/|an
сообщение 19.6.2005, 17:08
Сообщение #5


Digital Mystery
***

Группа: Пользователи
Сообщений: 1887
Регистрация: 1.9.2004
Пользователь №: 8



Нафига писать одно и тоже в разных темах?


--------------------
exclusive reality for you...
Перейти в начало страницы
 
+Цитировать сообщение
Гость_AbLaZe_*
сообщение 19.6.2005, 19:35
Сообщение #6





Гости






Цитата(Sha/|/|an @ Jun 19 2005, 05:08 PM)
Нафига писать одно и тоже в разных темах?
*


ну извини ... просто очень нужно ... smile.gif
Перейти в начало страницы
 
+Цитировать сообщение

Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



RSS Текстовая версия Сейчас: 20.11.2017, 14:36
 X 
Ссылки на работы форумчан:
1. Cайт по использованию 3D технологий
в образовании

2. 15 Defense. Underwater Battle

3. GlaZ в Steam Greenlight