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

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

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

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

Ответ
 
Опции темы
Старый 12.01.2013, 00:19   #1
Кирпи4
Социал-сычевист
 
Аватар для Кирпи4
 
Регистрация: 24.06.2011
Сообщений: 610
Написано 342 полезных сообщений
(для 1,357 пользователей)
BoundingBox

Блин, мужики, выручите по-братски...
Всю голову сломал, надо построить бокс вокруг меша неопределенной формы (то бишь пересчет позиций всех вертексов необходим).
Что то вот код понадобился, а написать не выходит...
__________________


(Offline)
 
Ответить с цитированием
Старый 12.01.2013, 00:55   #2
Wegox
Бывалый
 
Аватар для Wegox
 
Регистрация: 17.12.2011
Сообщений: 862
Написано 443 полезных сообщений
(для 1,133 пользователей)
Ответ: BoundingBox

Так
Graphics3D 800,600,32,2

CreateCamera()
CreateCube()
Box BoundEntity3D(M)
MoveEntity C,-6,5.2,4
PointEntity C
,M

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(57Then
        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#
    
= -999999
    Y 
= -999999
    Z 
= -999999
    BX 
999999
    BY 
999999
    BZ 
999999
    
    
For Surface 1 To CountSurfaces(Entity)
        
GetSurface(Entity,Surface)
        For 
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
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,316
Написано 2,450 полезных сообщений
(для 6,782 пользователей)
Сообщение Ответ: 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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
burovalex (14.01.2013)
Старый 14.01.2013, 12:50   #4
burovalex
Разработчик
 
Аватар для burovalex
 
Регистрация: 04.04.2012
Сообщений: 468
Написано 36 полезных сообщений
(для 59 пользователей)
Ответ: 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
burovalex
Разработчик
 
Аватар для burovalex
 
Регистрация: 04.04.2012
Сообщений: 468
Написано 36 полезных сообщений
(для 59 пользователей)
Ответ: 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
Wegox
Бывалый
 
Аватар для Wegox
 
Регистрация: 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(203Then sx#=sx#-1
If KeyDown(205Then sx#=sx#+1
If KeyDown(19Then sy#=sy#+1
If KeyDown(18Then sy#=sy#-1
If KeyDown(200Then sz#=sz#+1
If KeyDown(208Then 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
burovalex
Разработчик
 
Аватар для burovalex
 
Регистрация: 04.04.2012
Сообщений: 468
Написано 36 полезных сообщений
(для 59 пользователей)
Ответ: BoundingBox

Работает только с прямым расположением бокса.
А заменять одну строку (FitMesh), на 20 - не вижу смысла..
Миниатюры
Нажмите на изображение для увеличения
Название: temp.jpg
Просмотров: 689
Размер:	27.6 Кб
ID:	18486  
__________________
(Offline)
 
Ответить с цитированием
Старый 14.01.2013, 21:19   #8
Wegox
Бывалый
 
Аватар для Wegox
 
Регистрация: 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(203Then sx#=sx#-1
    
If KeyDown(205Then sx#=sx#+1
    
If KeyDown(19Then sy#=sy#+1
    
If KeyDown(33Then sy#=sy#-1
    
If KeyDown(200Then sz#=sz#+1
    
If KeyDown(208Then 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
burovalex
Разработчик
 
Аватар для burovalex
 
Регистрация: 04.04.2012
Сообщений: 468
Написано 36 полезных сообщений
(для 59 пользователей)
Ответ: 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(203Then sx#=sx#-1
If KeyDown(205Then sx#=sx#+1
If KeyDown(19Then sy#=sy#+1
If KeyDown(18Then sy#=sy#-1
If KeyDown(200Then sz#=sz#+1
If KeyDown(208Then 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(203Then sx#=sx#-1
    
If KeyDown(205Then sx#=sx#+1
    
If KeyDown(19Then sy#=sy#+1
    
If KeyDown(33Then sy#=sy#-1
    
If KeyDown(200Then sz#=sz#+1
    
If KeyDown(208Then 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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Wegox (15.01.2013)
Старый 14.01.2013, 23:00   #10
pepel
Мастер
 
Аватар для pepel
 
Регистрация: 23.09.2009
Адрес: ленобласть
Сообщений: 1,189
Написано 447 полезных сообщений
(для 2,526 пользователей)
Ответ: BoundingBox

Сообщение от burovalex Посмотреть сообщение
И научи меня спойлеры делать.



в расширенном режиме- монхромный смайл

или так [ OFFTOP ] [ /OFFTOP ]

(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо pepel за это полезное сообщение:
burovalex (15.01.2013), Wegox (15.01.2013)
Старый 15.01.2013, 02:48   #11
Wegox
Бывалый
 
Аватар для Wegox
 
Регистрация: 17.12.2011
Сообщений: 862
Написано 443 полезных сообщений
(для 1,133 пользователей)
Ответ: BoundingBox

Да не быстрее он работает, это просто матрица в реальном времени долго обсчитывается что-ли... не знаю, не решил пока
(Offline)
 
Ответить с цитированием
Старый 15.01.2013, 10:44   #12
burovalex
Разработчик
 
Аватар для burovalex
 
Регистрация: 04.04.2012
Сообщений: 468
Написано 36 полезных сообщений
(для 59 пользователей)
Ответ: BoundingBox

Да не отмазывайся! ))
__________________
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Wegox (15.01.2013)
Старый 15.01.2013, 15:31   #13
Wegox
Бывалый
 
Аватар для Wegox
 
Регистрация: 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
burovalex
Разработчик
 
Аватар для burovalex
 
Регистрация: 04.04.2012
Сообщений: 468
Написано 36 полезных сообщений
(для 59 пользователей)
Радость Ответ: BoundingBox

Сообщение от Кирпи4 Посмотреть сообщение
Блин, мужики, выручите по-братски...
Всю голову сломал, надо построить бокс вокруг меша неопределенной формы (то бишь пересчет позиций всех вертексов необходим).
Что то вот код понадобился, а написать не выходит...
Вообще, Вегокс, нас просили о другом. Я просто подметил что с фитом работает быстрее, хотя в коде не разбирался. )

В твоем примере, нужно было сделать так, чтобы ты сферу двигал, а полупрозразный бокс находил его реал размеры в реал тайме. Примерно так
__________________

Последний раз редактировалось burovalex, 15.01.2013 в 22:09.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

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


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


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