|
3D-программирование Вопросы, касающиеся программирования 3D мира |
12.01.2013, 00:19
|
#1
|
Социал-сычевист
Регистрация: 24.06.2011
Сообщений: 611
Написано 342 полезных сообщений (для 1,359 пользователей)
|
BoundingBox
Блин, мужики, выручите по-братски...
Всю голову сломал, надо построить бокс вокруг меша неопределенной формы (то бишь пересчет позиций всех вертексов необходим).
Что то вот код понадобился, а написать не выходит...
|
(Offline)
|
|
12.01.2013, 00:55
|
#2
|
Бывалый
Регистрация: 17.12.2011
Сообщений: 862
Написано 443 полезных сообщений (для 1,133 пользователей)
|
Ответ: BoundingBox
Так
Graphics3D 800,600,32,2
C = CreateCamera() M = CreateCube() Box = BoundEntity3D(M) MoveEntity C,-6,5.2,4 PointEntity C,M
L = CreateLight(2) PositionEntity L,32,32,32 LightRange L,24 LightColor L,200,200,200 CameraClsMode C,0,0 AmbientLight 32,32,32 Repeat
TurnEntity M,-.5,-.6,-.7 ScaleEntity M,Abs Sin(Float(MilliSecs())/40)*2,Abs Sin(Float(MilliSecs())/80)*2,Abs Cos(Float(MilliSecs())/160)*2 PositionEntity M,Sin(Float(MilliSecs())/40)*3,0,Cos(Float(MilliSecs())/40)*5 If KeyHit(57) Then Mode = Not Mode If Mode = 0 Then ShowEntity Box Else HideEntity Box EndIf EndIf If Mode = 0 Then BoundEntity3D M,Box,.2 UpdateWorld Cls WireFrame False AmbientLight 32,32,32 CameraClsMode C,0,1 RenderWorld CameraClsMode C,0,0 WireFrame True AmbientLight 255,255,255 HideEntity Box RenderWorld If Mode = 0 Then ShowEntity Box
Flip Until KeyHit(1)
Function BoundEntity3D(Entity,Box = 0,Outline#=.15) If Entity = 0 Then Return False EClass$ = EntityClass(Entity) If Lower(EClass$) <> "mesh" Then Return False
If Box = 0 Then Box = CreateCube() EntityFX Box,1+16 T = CreateTexture(256,256,1+16+32) SetBuffer(TextureBuffer(T)) Color 32,32,32 Rect 0,0,256,256,1 Color 0,0,0 Rect 6,6,256-12,256-12,True Color 255,255,255 Line 0,0,0,32 Line 0,255-32,0,255 Line 256,0,256,32 Line 255,255-32,255,255 Line 0,0,32,0 Line 255-32,0,255,0 Line 0,255,32,255 Line 255-32,255,255,255 SetBuffer(BackBuffer()) EntityTexture Box,T,0,0 EntityBlend Box,3 FreeTexture T EndIf Local X#,Y#,Z#,BX#,BY#,BZ# X = -999999 Y = -999999 Z = -999999 BX = 999999 BY = 999999 BZ = 999999 For Surface = 1 To CountSurfaces(Entity) S = GetSurface(Entity,Surface) For N = 0 To CountVertices(S)-1 TFormPoint VertexX(S,N),VertexY(S,N),VertexZ(S,N),Entity,0 If TFormedX() > X Then X = TFormedX() ElseIf TFormedX() < BX Then BX = TFormedX() EndIf If TFormedY() > Y Then Y = TFormedY() ElseIf TFormedY() < BY Then BY = TFormedY() EndIf If TFormedZ() > Z Then Z = TFormedZ() ElseIf TFormedZ() < BZ Then BZ = TFormedZ() EndIf Next Next FitMesh Box,X+Outline,Y+Outline,Z+Outline,BX-X-Outline*2,BY-Y-Outline*2,BZ-Z-Outline*2,0 Return Box End Function
|
(Offline)
|
|
12.01.2013, 01:16
|
#3
|
[object Object]
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,355
Написано 2,471 полезных сообщений (для 6,853 пользователей)
|
Ответ: BoundingBox
Сообщение от Кирпи4
Блин, мужики, выручите по-братски...
Всю голову сломал, надо построить бокс вокруг меша неопределенной формы (то бишь пересчет позиций всех вертексов необходим).
Что то вот код понадобился, а написать не выходит...
|
Нечто вроде:
Global EntityBox_Width#, EntityBox_Height#, EntityBox_Depth#
Function GetEntityBox(entity)
EntityBox_Width = 0
EntityBox_Height = 0
EntityBox_Depth = 0
Local surf_count = CountSurfaces(entity)
For surf_n = 0 To (surf_count - 1)
Local surf = GetSurface(entity, surf_n)
Local vert_count = CountVertices(surf)
For vert_n = 0 To (vert_count-1)
EntityBox_Width = Max(VertexX(surf, vert_n), EntityBox_Width)
EntityBox_Height = Max(VertexY(surf, vert_n), EntityBox_Height)
EntityBox_Depth = Max(VertexZ(surf, vert_n), EntityBox_Depth)
Next
Next
End Function
Function Max#(v1#, v2#)
If v1 > v2 Then
Return v1
Else
Return v2
EndIF
End Function
Писал прямо тут. Исправить ошибки, думаю, не трудно.
Там может быть косяк с CountSurfaces
Если у тебя AnimMesh то нужно обернуть это ещё в рекурсию и бежать по чайлдам.
И да, не злоупотребляй в цикле. Перебор - довольно ресурсоёмкая операция.
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
14.01.2013, 12:50
|
#4
|
Разработчик
Регистрация: 04.04.2012
Сообщений: 468
Написано 37 полезных сообщений (для 60 пользователей)
|
Ответ: BoundingBox
Спс Рандомайз, удобный код!
Только хочу добавить, что таким образом можно найти только 3 точки: самую правую, верхнюю и дальнюю. И если бокс построить по симметрии, а модель будет удлинена в другую сторону, меш вылезет за бокс.
Так что надо находить и три противоположные стороны
Извиняюсь, за корявость написания, не знаю как здесь табуляцией пользоваться..
Global EntityBox_Right#, EntityBox_Left#, EntityBox_Top#, EntityBox_Bottom#, EntityBox_Front#, EntityBox_Back#
Function GetEntityBox(entity)
EntityBox_Right = 0
EntityBox_Left = 0
EntityBox_Top = 0
EntityBox_Bottom = 0
EntityBox_Front = 0
EntityBox_Back = 0
Local surf_count = CountSurfaces(entity)
For surf_n = 0 To (surf_count - 1)
Local surf = GetSurface(entity, surf_n)
Local vert_count = CountVertices(surf)
For vert_n = 0 To (vert_count-1)
EntityBox_Right = Max(VertexX(surf, vert_n), EntityBox_Right)
EntityBox_Left = Min(VertexX(surf, vert_n), EntityBox_Left)
EntityBox_Top = Max(VertexY(surf, vert_n), EntityBox_Top)
EntityBox_Bottom = Min(VertexY(surf, vert_n), EntityBox_Bottom)
EntityBox_Front = Max(VertexZ(surf, vert_n), EntityBox_Front)
EntityBox_Back = Min(VertexZ(surf, vert_n), EntityBox_Back)
Next
Next
End Function
Function Max#(v1#, v2#)
If v1 > v2 Then
Return v1
Else
Return v2
EndIF
End Function
Function Min#(v1#, v2#)
If v1 > v2 Then
Return v2
Else
Return v1
EndIF
End Function
__________________
|
(Offline)
|
|
14.01.2013, 13:02
|
#5
|
Разработчик
Регистрация: 04.04.2012
Сообщений: 468
Написано 37 полезных сообщений (для 60 пользователей)
|
Ответ: BoundingBox
А чтоб занести бокс
;Надо найти центр бокса
x#=(EntityBox_Right+EntityBox_Left)/2
y#=(EntityBox_Top+EntityBox_Bottom)/2
z#=(EntityBox_Front+EntityBox_Back)/2
;найти размеры сторон
lx#=abs(EntityBox_Right-EntityBox_Left)
ly#=abs(EntityBox_Top-EntityBox_Bottom)
lz#=abs(EntityBox_Front-EntityBox_Back)
;у блитца есть полезная функция для этого, но точно не помню какие параметры надо заносить. Она подгоняет Меш под нужные размеры и выставляет ему новый осевой центр.
FitMesh(x,y,z,lx,ly,lz,false)
__________________
|
(Offline)
|
|
14.01.2013, 15:33
|
#6
|
Бывалый
Регистрация: 17.12.2011
Сообщений: 862
Написано 443 полезных сообщений (для 1,133 пользователей)
|
Ответ: BoundingBox
Сообщение от burovalex
А чтоб занести бокс
;Надо найти центр бокса
x#=(EntityBox_Right+EntityBox_Left)/2
y#=(EntityBox_Top+EntityBox_Bottom)/2
z#=(EntityBox_Front+EntityBox_Back)/2
;найти размеры сторон
lx#=abs(EntityBox_Right-EntityBox_Left)
ly#=abs(EntityBox_Top-EntityBox_Bottom)
lz#=abs(EntityBox_Front-EntityBox_Back)
;у блитца есть полезная функция для этого, но точно не помню какие параметры надо заносить. Она подгоняет Меш под нужные размеры и выставляет ему новый осевой центр.
FitMesh(x,y,z,lx,ly,lz,false)
|
Можно избавится от FitMesh так:
Function EntityScaleX#(Entity) Vx# = GetMatElement(Entity, 0, 0) Vy# = GetMatElement(Entity, 0, 1) Vz# = GetMatElement(Entity, 0, 2) Scale# = Sqr(Vx#*Vx# + Vy#*Vy# + Vz#*Vz#) Return Scale# End Function Function EntityScaleY#(Entity) Vx# = GetMatElement(Entity, 1, 0) Vy# = GetMatElement(Entity, 1, 1) Vz# = GetMatElement(Entity, 1, 2) Scale# = Sqr(Vx#*Vx# + Vy#*Vy# + Vz#*Vz#) Return Scale# End Function Function EntityScaleZ#(Entity) Vx# = GetMatElement(Entity, 2, 0) Vy# = GetMatElement(Entity, 2, 1) Vz# = GetMatElement(Entity, 2, 2) Scale# = Sqr(Vx#*Vx# + Vy#*Vy# + Vz#*Vz#) Return Scale# End Function Function Detect(Entity,FitEntity) sr#=EntityScaleX#(Entity):w#=EntityScaleX#(FitEntity) sr#=EntityScaleY#(Entity):h#=EntityScaleY#(FitEntity) sr#=EntityScaleZ#(Entity):d#=EntityScaleZ#(FitEntity) sx#=EntityX(Entity):x#=EntityX(FitEntity) sy#=EntityY(Entity):y#=EntityY(FitEntity) sz#=EntityZ(Entity):z#=EntityZ(FitEntity)
bw#=w+w:bx#=x-w bh#=h+h:by#=y-h bd#=d+d:bz#=z-d
dmin#=0 sr2#=sr*sr
If sx < bx dmin#=dmin+((sx-bx)*(sx-bx)) ElseIf sx>(bx+bw) dmin=dmin+(((sx-(bx+bw)))*((sx-(bx+bw)))) EndIf
If sy < by dmin=dmin+((sy-by)*(sy-by)) ElseIf sy>(by+bh) dmin=dmin+(((sy-(by+bh)))*((sy-(by+bh)))) EndIf
If sz < bz dmin=dmin+((sz-bz)*(sz-bz)) ElseIf sz>(bz+bd) dmin=dmin+(((sz-(bz+bd)))*((sz-(bz+bd)))) EndIf
If dmin<sr2 Return 1 Else Return 0 EndIf End Function
Graphics3D 640,480,16,2 MoveMouse 640/2,480/2
cam=CreateCamera() PositionEntity cam,0,100,-100 RotateEntity cam,30,0,0 light=CreateLight()
box=CreateCube() EntityColor box,123,140,200 ScaleEntity box,10,25,41 PositionEntity box,10,10,10
sphere=CreateSphere(4) EntityColor sphere,255,0,0 ScaleEntity sphere,2,2,2
While Not KeyDown(1)
mxs=mxs+MouseXSpeed() mys=mys+MouseYSpeed() RotateEntity cam,mys,-mxs,0 MoveEntity cam,0,0,MouseDown(1)-MouseDown(2)
If KeyDown(203) Then sx#=sx#-1 If KeyDown(205) Then sx#=sx#+1 If KeyDown(19) Then sy#=sy#+1 If KeyDown(18) Then sy#=sy#-1 If KeyDown(200) Then sz#=sz#+1 If KeyDown(208) Then sz#=sz#-1
sx#=sx#+mx# sy#=sy#+my# sz#=sz#+mz# PositionEntity sphere,sx#,sy#,sz#
RenderWorld
If Detect(sphere,box) Color 500,0,0 Text 300,300,"Detec Sphere" EndIf
Flip Wend End
|
(Offline)
|
|
14.01.2013, 20:48
|
#7
|
Разработчик
Регистрация: 04.04.2012
Сообщений: 468
Написано 37 полезных сообщений (для 60 пользователей)
|
Ответ: BoundingBox
Работает только с прямым расположением бокса.
А заменять одну строку (FitMesh), на 20 - не вижу смысла..
__________________
|
(Offline)
|
|
14.01.2013, 21:19
|
#8
|
Бывалый
Регистрация: 17.12.2011
Сообщений: 862
Написано 443 полезных сообщений (для 1,133 пользователей)
|
Ответ: BoundingBox
Сообщение от burovalex
Работает только с прямым расположением бокса.
А заменять одну строку (FitMesh), на 20 - не вижу смысла..
|
Ну даже и не знаю, у меня в IDE всего четыре лишних строчки) да и работает быстрее чем FitMesh, а повороты тоже можно контролировать, надо просто сделать это!
вот аналог с FitMesh
Function Detect(sx#,sy#,sz#,sr#,bx#,by#,bz#,bw#,bh#,bd#) Local dmin#=0 Local sr2#=sr*sr If sx < bx dmin=dmin+((sx-bx)*(sx-bx)) Else If sx>(bx+bw) dmin=dmin+(((sx-(bx+bw)))*((sx-(bx+bw)))) EndIf If sy < by dmin=dmin+((sy-by)*(sy-by)) Else If sy>(by+bh) dmin=dmin+(((sy-(by+bh)))*((sy-(by+bh)))) EndIf If sz < bz dmin=dmin+((sz-bz)*(sz-bz)) Else If sz>(bz+bd) dmin=dmin+(((sz-(bz+bd)))*((sz-(bz+bd)))) EndIf If dmin#<=sr2# Then Return True Else Return False End Function
width=640 height=480
Graphics3D width,height,0,2 SetBuffer BackBuffer()
MoveMouse width/2,height/2
cam=CreateCamera() PositionEntity cam,0,100,-100 RotateEntity cam,30,0,0
light=CreateLight()
bx#=0 ; box x by#=0 ; box y bz#=0 ; box z bw#=50 ; box width bh#=50 ; box height bd#=50 ; box depth sx#=0 ; sphere x sy#=0 ; sphere y sz#=0 ; sphere z sr#=5 ; sphere radius
box=CreateCube() EntityColor box,255,255,0 FitMesh box,0,0,0,bw,bd,bh PositionEntity box,bx,by,bz
sphere=CreateSphere() EntityColor sphere,255,0,0 ScaleEntity sphere,sr,sr,sr
PositionEntity sphere,sx#,sy#,sz#
While Not KeyDown(1)
mxs=mxs+MouseXSpeed() mys=mys+MouseYSpeed()
RotateEntity cam,mys,-mxs,0 MoveEntity cam,0,0,MouseDown(1)-MouseDown(2)
If KeyDown(203) Then sx#=sx#-1 If KeyDown(205) Then sx#=sx#+1 If KeyDown(19) Then sy#=sy#+1 If KeyDown(33) Then sy#=sy#-1 If KeyDown(200) Then sz#=sz#+1 If KeyDown(208) Then sz#=sz#-1
sx#=sx#+mx# sy#=sy#+my# sz#=sz#+mz#
PositionEntity sphere,sx#,sy#,sz#
RenderWorld If Detect(sx#,sy#,sz#,sr#,bx#,by#,bz#,bw#,bh#,bd#)=True Then Text 0,0,"Detec Sphere" Flip
Wend
Тормоза жуткие
|
(Offline)
|
|
14.01.2013, 22:11
|
#9
|
Разработчик
Регистрация: 04.04.2012
Сообщений: 468
Написано 37 полезных сообщений (для 60 пользователей)
|
Ответ: BoundingBox
А НИФИГААА!! ))
я конечно не вникал особо в код, но как понял 2-й код в 3 раза быстрее. Это просто с камерой косяк какой то. У меня такое бывало, это гдето писать код не желательно. либо между рендером и флипом, либо ...
Сам посмотри. Пример на 10к повторов за цикл. )
И научи меня спойлеры делать.
Function EntityScaleX#(Entity) Vx# = GetMatElement(Entity, 0, 0) Vy# = GetMatElement(Entity, 0, 1) Vz# = GetMatElement(Entity, 0, 2) Scale# = Sqr(Vx#*Vx# + Vy#*Vy# + Vz#*Vz#) Return Scale# End Function Function EntityScaleY#(Entity) Vx# = GetMatElement(Entity, 1, 0) Vy# = GetMatElement(Entity, 1, 1) Vz# = GetMatElement(Entity, 1, 2) Scale# = Sqr(Vx#*Vx# + Vy#*Vy# + Vz#*Vz#) Return Scale# End Function Function EntityScaleZ#(Entity) Vx# = GetMatElement(Entity, 2, 0) Vy# = GetMatElement(Entity, 2, 1) Vz# = GetMatElement(Entity, 2, 2) Scale# = Sqr(Vx#*Vx# + Vy#*Vy# + Vz#*Vz#) Return Scale# End Function Function Detect(Entity,FitEntity) sr#=EntityScaleX#(Entity):w#=EntityScaleX#(FitEntity) sr#=EntityScaleY#(Entity):h#=EntityScaleY#(FitEntity) sr#=EntityScaleZ#(Entity):d#=EntityScaleZ#(FitEntity) sx#=EntityX(Entity):x#=EntityX(FitEntity) sy#=EntityY(Entity):y#=EntityY(FitEntity) sz#=EntityZ(Entity):z#=EntityZ(FitEntity) bw#=w+w:bx#=x-w bh#=h+h:by#=y-h bd#=d+d:bz#=z-d dmin#=0 sr2#=sr*sr If sx < bx dmin#=dmin+((sx-bx)*(sx-bx)) ElseIf sx>(bx+bw) dmin=dmin+(((sx-(bx+bw)))*((sx-(bx+bw)))) EndIf If sy < by dmin=dmin+((sy-by)*(sy-by)) ElseIf sy>(by+bh) dmin=dmin+(((sy-(by+bh)))*((sy-(by+bh)))) EndIf If sz < bz dmin=dmin+((sz-bz)*(sz-bz)) ElseIf sz>(bz+bd) dmin=dmin+(((sz-(bz+bd)))*((sz-(bz+bd)))) EndIf If dmin<sr2 Return 1 Else Return 0 EndIf End Function Graphics3D 640,480,16,2 MoveMouse 640/2,480/2 cam=CreateCamera() PositionEntity cam,0,100,-100 RotateEntity cam,30,0,0 light=CreateLight() box=CreateCube() EntityColor box,123,140,200 ScaleEntity box,10,25,41 PositionEntity box,10,10,10 RotateEntity box,0,40,0 sphere=CreateSphere(4) EntityColor sphere,255,0,0 ScaleEntity sphere,2,2,2 Global frame,xframe,time,maxTime While Not KeyDown(1) frame=MilliSecs() frameNum=frameNum+1 mxs=MouseXSpeed() mys=MouseYSpeed() TurnEntity cam,mys*.3,-mxs*.3,0 MoveEntity cam,0,0,MouseDown(1)-MouseDown(2) If KeyDown(203) Then sx#=sx#-1 If KeyDown(205) Then sx#=sx#+1 If KeyDown(19) Then sy#=sy#+1 If KeyDown(18) Then sy#=sy#-1 If KeyDown(200) Then sz#=sz#+1 If KeyDown(208) Then sz#=sz#-1 sx#=sx#+mx# sy#=sy#+my# sz#=sz#+mz# PositionEntity sphere,sx#,sy#,sz# RenderWorld For i=1 To 10000 Detect(sphere,box) Next Text 10,10,"millisecs: "+time Text 10,30,"maxMillisecs"+maxTime Flip time=MilliSecs()-frame If time>maxTime And frameNum>30 Then maxTime=time Wend End
Function Detect(sx#,sy#,sz#,sr#,bx#,by#,bz#,bw#,bh#,bd#) Local dmin#=0 Local sr2#=sr*sr If sx < bx dmin=dmin+((sx-bx)*(sx-bx)) Else If sx>(bx+bw) dmin=dmin+(((sx-(bx+bw)))*((sx-(bx+bw)))) EndIf If sy < by dmin=dmin+((sy-by)*(sy-by)) Else If sy>(by+bh) dmin=dmin+(((sy-(by+bh)))*((sy-(by+bh)))) EndIf If sz < bz dmin=dmin+((sz-bz)*(sz-bz)) Else If sz>(bz+bd) dmin=dmin+(((sz-(bz+bd)))*((sz-(bz+bd)))) EndIf If dmin#<=sr2# Then Return True Else Return False End Function width=640 height=480 Graphics3D width,height,0,2 SetBuffer BackBuffer() MoveMouse width/2,height/2 cam=CreateCamera() PositionEntity cam,0,100,-100 RotateEntity cam,30,0,0 light=CreateLight() bx#=0 ; box x by#=0 ; box y bz#=0 ; box z bw#=50 ; box width bh#=50 ; box height bd#=50 ; box depth sx#=0 ; sphere x sy#=0 ; sphere y sz#=0 ; sphere z sr#=5 ; sphere radius box=CreateCube() EntityColor box,255,255,0 FitMesh box,0,0,0,bw,bd,bh PositionEntity box,bx,by,bz sphere=CreateSphere() EntityColor sphere,255,0,0 ScaleEntity sphere,sr,sr,sr PositionEntity sphere,sx#,sy#,sz# Global frame,xframe,time,maxTime While Not KeyDown(1) frameNum=frameNum+1 frame=MilliSecs() mxs=MouseXSpeed() mys=MouseYSpeed() TurnEntity cam,mys*.3,-mxs*.3,0 MoveEntity cam,0,0,MouseDown(1)-MouseDown(2) If KeyDown(203) Then sx#=sx#-1 If KeyDown(205) Then sx#=sx#+1 If KeyDown(19) Then sy#=sy#+1 If KeyDown(33) Then sy#=sy#-1 If KeyDown(200) Then sz#=sz#+1 If KeyDown(208) Then sz#=sz#-1 sx#=sx#+mx# sy#=sy#+my# sz#=sz#+mz# PositionEntity sphere,sx#,sy#,sz# For i=1 To 10000 Detect(sx#,sy#,sz#,sr#,bx#,by#,bz#,bw#,bh#,bd#) Next RenderWorld Text 10,10,"millisecs: "+time Text 10,30,"maxMillisecs"+maxTime Flip time=MilliSecs()-frame If time>maxTime And frameNum>30 Then maxTime=time Wend End
__________________
Последний раз редактировалось burovalex, 15.01.2013 в 10:42.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
14.01.2013, 23:00
|
#10
|
Мастер
Регистрация: 23.09.2009
Адрес: ленобласть
Сообщений: 1,189
Написано 447 полезных сообщений (для 2,526 пользователей)
|
Ответ: BoundingBox
Сообщение от burovalex
И научи меня спойлеры делать.
|
в расширенном режиме- монхромный смайл
или так [ OFFTOP ] [ /OFFTOP ]
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо pepel за это полезное сообщение:
|
|
15.01.2013, 02:48
|
#11
|
Бывалый
Регистрация: 17.12.2011
Сообщений: 862
Написано 443 полезных сообщений (для 1,133 пользователей)
|
Ответ: BoundingBox
Да не быстрее он работает, это просто матрица в реальном времени долго обсчитывается что-ли... не знаю, не решил пока
|
(Offline)
|
|
15.01.2013, 10:44
|
#12
|
Разработчик
Регистрация: 04.04.2012
Сообщений: 468
Написано 37 полезных сообщений (для 60 пользователей)
|
Ответ: BoundingBox
Да не отмазывайся! ))
__________________
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
15.01.2013, 15:31
|
#13
|
Бывалый
Регистрация: 17.12.2011
Сообщений: 862
Написано 443 полезных сообщений (для 1,133 пользователей)
|
Ответ: BoundingBox
Я и не отмазываюсь давай по честному.
1)
For i=1 To 10000
FitMesh box,0,0,0,bw,bd,bh
Detect(sx#,sy#,sz#,sr#,bx#,by#,bz#,bw#,bh#,bd#)
Next
2) Я же в реальном времени масштабирую объект!
3) А потом скомпилируй код в *exe и посмотри что быстрее!
|
(Offline)
|
|
15.01.2013, 18:37
|
#14
|
Разработчик
Регистрация: 04.04.2012
Сообщений: 468
Написано 37 полезных сообщений (для 60 пользователей)
|
Ответ: BoundingBox
Сообщение от Кирпи4
Блин, мужики, выручите по-братски...
Всю голову сломал, надо построить бокс вокруг меша неопределенной формы (то бишь пересчет позиций всех вертексов необходим).
Что то вот код понадобился, а написать не выходит...
|
Вообще, Вегокс, нас просили о другом. Я просто подметил что с фитом работает быстрее, хотя в коде не разбирался. )
В твоем примере, нужно было сделать так, чтобы ты сферу двигал, а полупрозразный бокс находил его реал размеры в реал тайме. Примерно так
__________________
Последний раз редактировалось burovalex, 15.01.2013 в 22:09.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 20:26.
|