Приветствую Вас Гость | Зарегистрироваться | Вход | RSS

Поиск по сайту:
Поиск в интернете:
Главная » Статьи » Учебники по Blitz3d

Выбор объектов в Blitz3D
Иногда Blitz3D можно использовать и для написания 3D редакторов, где требуется получать указатели на объекты, т.е. их переменные, для дальнейших манипуляций с ними. В знаменитых редакторах это делается путем наведения курсора мышки на объект, и клику по нему. Ваш редактор будет ни чуть не хуже остальных. Мы научимся выделять какой либо объект мышкой.

В Blitz3D для этого существуют специальные функции – EntityPickMode, CameraPick, EntityPick, LinePick.

При создании объекта, следует назначить ему режим EntityPickMode


sphere=CreateSphere()
EntityPickMode sphere,1


А в главном цикле пишем команду e=CameraPick( camera,x,y ), где

е – это переменная, в которую возвращается объект, находящийся под курсором мышки

camera – это наша камера

x,y – это координаты курсора мыши

Подробнее о режимах выбора смотрите справку по команде EntityPickMode

А вот небольшой пример использования этих команд

Пример:


Graphics3D 800,600

sphere=CreateSphere()
EntityPickMode sphere,1

For k=1 To 100
model=CopyEntity( sphere )
EntityColor model,Rnd(255),Rnd(255),Rnd(255)
EntityShininess model,Rnd(1)

rad#=Rnd(1,2)
EntityRadius model,rad
ScaleEntity model,rad,rad,rad
TurnEntity model,Rnd(360),Rnd(360),0
MoveEntity model,0,0,Rnd(20)+20
Next

FreeEntity sphere

light=CreateLight()
TurnEntity light,45,45,0

camera=CreateCamera()
CameraRange camera,.1,1000

entity=0

zoom#=1

While Not KeyHit(1)
UpdateWorld
RenderWorld

If KeyDown(30) zoom=zoom*1.1
If KeyDown(44) zoom=zoom/1.1
CameraZoom camera,zoom

x=MouseX()
y=MouseY()

If y<32 TurnEntity camera,-2,0,0
If y>480-32 TurnEntity camera,2,0,0

If x<32 TurnEntity camera,0,2,0
If x>640-32 TurnEntity camera,0,-2,0

e=CameraPick( camera,x,y )
If e<>entity
If entity Then Draw_Wire_2D(entity,camera,0,0,0)
entity=e
EndIf

If entity
Draw_Wire_2D(entity,camera,250,250,250)
EndIf


Rect x,y-3,1,7
Rect x-3,y,7,1

Flip

Wend

Function Draw_Wire_2D(mesh,cam,red=0,grn=0,blu=0)
Color red,grn,blu
If EntityInView(mesh,cam)=False Then Return
cnt=CountSurfaces(mesh)
For a=1 To cnt
surf=GetSurface(mesh,a)
For tri=0 To CountTriangles(surf)-1
TFormPoint VertexX(surf,TriangleVertex(surf,tri,0)),VertexY(surf,TriangleVertex(surf,tri,0)),VertexZ(surf,TriangleVertex(surf,tri,0)),mesh,0
CameraProject(cam,TFormedX(),TFormedY(),TFormedZ())
sx1=ProjectedX()
sy1=ProjectedY()
TFormPoint VertexX(surf,TriangleVertex(surf,tri,1)),VertexY(surf,TriangleVertex(surf,tri,1)),VertexZ(surf,TriangleVertex(surf,tri,1)),mesh,0
CameraProject(cam,TFormedX(),TFormedY(),TFormedZ())
sx2=ProjectedX()
sy2=ProjectedY()
TFormPoint VertexX(surf,TriangleVertex(surf,tri,2)),VertexY(surf,TriangleVertex(surf,tri,2)),VertexZ(surf,TriangleVertex(surf,tri,2)),mesh,0
CameraProject(cam,TFormedX(),TFormedY(),TFormedZ())
sx3=ProjectedX()
sy3=ProjectedY()
If Check_Cull_2D(sx1,sy1,sx2,sy2,sx3,sy3)<0
Line sx1,sy1,sx2,sy2
Line sx2,sy2,sx3,sy3
Line sx3,sy3,sx1,sy1
End If
Next
Next
End Function

Function Check_Cull_2D(x1,y1,x2,y2,x3,y3)
Return (x1-x2)*(y3-y2)-(y1-y2)*(x3-x2)
End Function


Вместо функций Draw_Wire_2D вы можете воспользоваться любой другой, дающей различные эффекты, например EntityFX или EntityAlpha или своими собственными.

Категория: Учебники по Blitz3d | Добавил: blitz3d-portal (08.Декабрь.06) E W
Просмотров: 2315 | Комментарии: 3 | Рейтинг: 2.0/1
Всего комментариев: 2
1 DarkFox  
0
Все норм. Только вот лучше если програмные слова были белыми, а то сливаютсяс фоном

2 Nevil  
0
по такому принципу можно стратегию сделать?

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]