Начнем с откровения: я тупой! Хотя это не откровение, а диагноз, если ты используешь Блитц3Д в 2к18-ом
Я уже не один день ломаю голову над тем, как сделать 2D прямоугольник, который описывает в себе 3D модель.
Мне лишь нужно получить координаты двух точек:
1) точка на 2D скрине, которая обозначает
начало по X и Y 3D объекта на 2D скрине.
2) точка на 2D скрине, которая обозначает
конец по X и Y 3D объекта на 2D скрине.
Я лишь смог найти центр объекта при помощи
CameraPick.
Может надо как-то прописать расположения этих двух точек в зависимости от
EntityDistance?
Вот код, кому интересно:
Include "Include\FastImage.bb"
Graphics3D 800,600,32,2
InitDraw
Global FL_Pitch#,FL_Yaw#,FL_Roll#
Global FL_XSpeed#,FL_YSpeed#,FL_ZSpeed#
Global speed#=0.05
Global gw#=GraphicsWidth()
Global gh#=GraphicsHeight()
Global gui_show%=0
Global time#=0
Global guiscale#=0
cam=CreateCamera()
CameraClsColor cam, 40, 40, 40
PositionEntity cam,0,0,-3
lit=CreateLight()
cube=CreateCube()
EntityPickMode cube,2
fnt=LoadImageFont("Fonts\courier_new_20.txt")
SetImageFont fnt
hud=LoadImageEx("HUD_center_scope_a.png",1+2,FI_MIDHANDLE Or FI_FILTEREDIMAGE)
outline=LoadImageEx("HUD_outline_a2.png",1+2,FI_MIDHANDLE Or FI_FILTEREDIMAGE)
HidePointer
While Not KeyHit(1)
CameraPick(cam,MouseX(),MouseY())
If MouseHit(2) Then MoveMouse gw,gh
If MouseDown(2)
FreeLook (cam)
EndIf
RenderWorld
StartDraw
SetBlend FI_ALPHABLEND ; set 'alpha' blend mode
SetAlpha 1
If PickedEntity ()=cube
SetColor (0,255,0)
Else
SetColor (255,255,255)
EndIf
DrawImageRectEx (hud,MouseX()+8,MouseY()+8,16,16)
ShowOutline(cam,cube,outline)
EndDraw
UpdateWorld
FlushMouse
Flip
Wend
DeinitDraw
ClearWorld
End
Function ShowOutline(cam,ent,img)
CameraProject cam, EntityX(ent),EntityY(ent),EntityZ(ent)
If PickedEntity()=ent
SetColor (0,255,0)
CameraPick (cam,ProjectedX()-guiscale,ProjectedY()-guiscale)
DrawImagePart (img,(ProjectedX#()+8)-guiscale,(ProjectedY#()+8)-guiscale,8,8,0,0,8,8)
DrawImagePart (img,(ProjectedX#()+8)-guiscale,ProjectedY#()+guiscale,8,8,0,8,8,8)
DrawImagePart (img,ProjectedX#()+guiscale,ProjectedY#()+guiscale,8,8,8,8,8,8)
DrawImagePart (img,ProjectedX#()+guiscale,(ProjectedY#()+8)-guiscale,8,8,8,0,8,8)
DrawText("Distance: "+Int EntityDistance(cam,ent),5,5,0,0)
If PickedEntity()=ent
guiscale=guiscale+1
Else
guiscale=guiscale-1
EndIf
Else
guiscale=0
EndIf
End Function
Function ARGB(Alpha#, Red, Green, Blue)
Return (Int(Alpha*255) Shl 24) Or (Red Shl 16) Or (Green Shl 8) Or Blue
End Function
Function FreeLook(FL_Cam)
FL_Pitch#=FL_Pitch#+(MouseYSpeed()*0.02)
FL_Pitch#=FL_Pitch#/1.2
FL_Yaw#=FL_Yaw#+-(MouseXSpeed()*0.02)
FL_Yaw#=FL_Yaw#/1.2
MoveMouse (GraphicsWidth()/2,GraphicsHeight()/2)
FL_ZSpeed#=FL_ZSpeed#+Float(KeyDown(17)-KeyDown(31))*speed# ; W & S
FL_ZSpeed#=FL_ZSpeed#/1.14
FL_XSpeed#=FL_XSpeed#+Float(KeyDown(32)-KeyDown(30))*speed# ; A & D
FL_XSpeed#=FL_XSpeed#/1.14
FL_YSpeed#=FL_YSpeed#+Float(KeyDown(19)-KeyDown(33))*speed# ; R & F
FL_YSpeed#=FL_YSpeed#/1.14
FL_Roll#=(FL_Yaw#*speed#)-(FL_XSpeed#*1.7)
MoveEntity FL_Cam,FL_XSpeed#,FL_YSpeed#+Abs(FL_Roll#*FL_XSpeed#)/50,FL_ZSpeed#
Local cp#=EntityPitch(FL_Cam,True)+FL_Pitch#
If cp<-89 Then cp=-89
If cp>89 Then cp=89
RotateEntity FL_Cam,cp,EntityYaw(FL_Cam)+FL_Yaw#,FL_Roll#
End Function
И да, тут тонна говнокода, да еще и
Fastimage присобачил, и файлики надо, кароч дурдом.
Не смотря на кучу мусора и костылей в коде, вс работает почти как надо, только через постоянное добавление и убавление переменной
guiscale приводит к постоянным скачкам рамки. И еще желательно бы, чтобы после отдаления камеры от объекта рамка постоянно была у границ объекта, а так она медленно ползет на них.
Если есть способ проще - сообщите.
Если охота произвести код в Блитце - могу кинуть в архиве со всеми нужными файликами спрайтов и библиотек.
ЗАРАНЕЕ СПАСИБО!
UPD: Может кто раньше ползловался MODEX от L.D.M.T? Там при выборе объекта вокруг него появляется рамка- это именно то что мне нужно.