forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   3D объект в 2D рамке. Как? Я тупой( (http://forum.boolean.name/showthread.php?t=20723)

FlameSword 14.07.2018 19:53

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? Там при выборе объекта вокруг него появляется рамка- это именно то что мне нужно.

Arton 15.07.2018 02:37

Ответ: 3D объект в 2D рамке. Как? Я тупой(
 
2D в Blitz3D тормоз, для динамики лучше не использовать.

Для 2D есть такая либа Draw3D.

Цитата:

Там при выборе объекта вокруг него появляется рамка- это именно то что мне нужно.
В Ashadow есть такое по умолчанию. Контур вокруг объекта можно сделать, как подсветка в играх бывает.

Fastimage - вот эта штука, не смотря на свою продвинутость, тупо перестала работать в какой-то момент.
По этому твой код даже смотреть не буду. Не говоря уже о файликах.
Ashadow способен работать до сих пор, почти полностью. Правда выше Win7 не пробовал, но думаю тоже должен.


P. S. Всё выше названное можно найти по ссылке в моей подписи.

P. P. S. Если ты не настольгируешь, то может тебе движок поновее попробовать?

FlameSword 15.07.2018 22:35

Ответ: 3D объект в 2D рамке. Как? Я тупой(
 
Цитата:

2D в Blitz3D тормоз, для динамики лучше не использовать.
Все 2D графические функции я беру из FastImage. Да и работает он у меня нормально.
Цитата:

По этому твой код даже смотреть не буду.
Да не обязательно смотреть код. Меня только интересует способ получения координат левого-верхнего и правого-нижнего угла 3D объекта на 2D экране.

ABTOMAT 16.07.2018 02:49

Ответ: 3D объект в 2D рамке. Как? Я тупой(
 
Цитата:

Сообщение от FlameSword (Сообщение 315363)
Все 2D графические функции я беру из FastImage. Да и работает он у меня нормально.

Да не обязательно смотреть код. Меня только интересует способ получения координат левого-верхнего и правого-нижнего угла 3D объекта на 2D экране.

CameraProject жи!


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

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