Показать сообщение отдельно
Старый 14.07.2018, 19:53   #1
FlameSword
AnyKey`щик
 
Аватар для FlameSword
 
Регистрация: 06.03.2015
Сообщений: 11
Написано 2 полезных сообщений
(для 6 пользователей)
Вопрос 3D объект в 2D рамке. Как? Я тупой(

Начнем с откровения: я тупой! Хотя это не откровение, а диагноз, если ты используешь Блитц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? Там при выборе объекта вокруг него появляется рамка- это именно то что мне нужно.
__________________
В этом мире нет ничего невозможного.

Последний раз редактировалось FlameSword, 14.07.2018 в 20:05. Причина: Дополнение деталями
(Offline)
 
Ответить с цитированием