Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > 3D-программирование

3D-программирование Вопросы, касающиеся программирования 3D мира

Ответ
 
Опции темы
Старый 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)
 
Ответить с цитированием
Старый 15.07.2018, 02:37   #2
Arton
Быдлокодер
 
Аватар для Arton
 
Регистрация: 05.07.2009
Адрес: Проспит
Сообщений: 5,019
Написано 2,312 полезных сообщений
(для 5,349 пользователей)
Ответ: 3D объект в 2D рамке. Как? Я тупой(

2D в Blitz3D тормоз, для динамики лучше не использовать.

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

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

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


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

P. P. S. Если ты не настольгируешь, то может тебе движок поновее попробовать?
(Offline)
 
Ответить с цитированием
Старый 15.07.2018, 22:35   #3
FlameSword
AnyKey`щик
 
Аватар для FlameSword
 
Регистрация: 06.03.2015
Сообщений: 11
Написано 2 полезных сообщений
(для 6 пользователей)
Ответ: 3D объект в 2D рамке. Как? Я тупой(

2D в Blitz3D тормоз, для динамики лучше не использовать.
Все 2D графические функции я беру из FastImage. Да и работает он у меня нормально.
По этому твой код даже смотреть не буду.
Да не обязательно смотреть код. Меня только интересует способ получения координат левого-верхнего и правого-нижнего угла 3D объекта на 2D экране.
__________________
В этом мире нет ничего невозможного.
(Offline)
 
Ответить с цитированием
Старый 16.07.2018, 02:49   #4
ABTOMAT
Ференька
 
Аватар для ABTOMAT
 
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,741
Написано 5,461 полезных сообщений
(для 15,675 пользователей)
Ответ: 3D объект в 2D рамке. Как? Я тупой(

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

Да не обязательно смотреть код. Меня только интересует способ получения координат левого-верхнего и правого-нижнего угла 3D объекта на 2D экране.
CameraProject жи!
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**

* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена

(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
St_AnGer (16.07.2018)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com