forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Blitz3D (http://forum.boolean.name/forumdisplay.php?f=45)
-   -   Вопрос-Ответ (для новичков) (http://forum.boolean.name/showthread.php?t=7886)

DeeJex 09.03.2011 03:16

Ответ: Вопрос-Ответ (для новичков)
 

Hint: Стандартную систему коллизий использовать не желательно. Гораздо лучше прикрутить физикс. Главное уметь им правильно пользоваться.

RegIon 13.03.2011 12:51

Ответ: Вопрос-Ответ (для новичков)
 
Код:

Graphics3D 640,480,16,2
SetBuffer BackBuffer()
cam=CreateCamera()
Light=CreateLight()
PositionEntity cam,0,5,-10
TurnEntity cam,20,0,0

phWorldCreate(1,"")
;phMatSetDefFriction(1,0.9)
phMatSetDefElasticity(0.0)
Plan=CreatePlane()
EntityColor plan,90,182,211

mat_cub=phMatCreate()
cub=CreateCube()
cub_=phBodyCreateBox(2,2,2,4)
phBodySetEntity cub_,cub
phBodySetMat(cub_,mat_cub)

mat_cub2=phMatCreate()
cub2=CreateCube()
cub2_=phBodyCreateBox(2,2,2,1)
phBodySetEntity cub2_,cub2
phBodySetDamping cub_,.5,1
phBodySetMat(cub_,mat_cub)

phMatSetFriction mat_cub,mat_cub2,1,.9
Repeat
UpdateChar(cub_)
If KeyHit(57) phBodySetPos cub2_,Rnd(-2,2),10,Rnd(-2,2)




phWorldStep(100)
  UpdateWorld
  RenderWorld
Flip

Until KeyHit(1)

End

Function UpdateChar(body%,maxvel#=5)
    phBodySetOmega body,-phBodyGetOmegaX(body),-phBodyGetOmegaY(body),-phBodyGetOmegaZ(body);чтоб не крутился
    ;проверяем, есть ли под ногами земля (или хоть что-то)
    x# = phBodyGetX(body)
    y# = phBodyGetY(body)
    z# = phBodyGetZ(body)

    If (phRayCast(x,y,z,x,y-5.1,z));на земле
        ;желаемая скорость
        TFormVector (KeyDown(32)-KeyDown(30)),0,(KeyDown(17)-KeyDown(31)),cub,0
        vx# = TFormedX()*maxvel
        vy# = TFormedY()*maxvel
        vz# = TFormedZ()*maxvel
        ;текущая скорость
        vxcur# = phBodyGetVelX(body)
        vycur# = phBodyGetVelY(body)
        vzcur# = phBodyGetVelZ(body)
        ;"вежливо" устанавливаем ту скорость, которую хотим мы
        ;считаем желаемое изменение скорости
        dvx# = (vx-vxcur);*.1
        If (vx*vx+vz*vz)<.001 Then dvy# = vy - vycur Else dvy# = 0
        dvz# = (vz-vzcur);*.1
        phBodyAddImpulse(body,x,y,z,dvx,dvy,dvz)
       
    EndIf

End Function

почему то не работают материалы,хотя трение должно быть максимальным..

LLI.T.A.L.K.E.R. 20.03.2011 02:29

Ответ: Вопрос-Ответ (для новичков)
 
Рисунок: http://s53.radikal.ru/i141/1103/92/ea40fd599a7b.jpg

Код внутри

Код:

; AddMesh Example
; ---------------

Graphics3D 640,480
SetBuffer BackBuffer()

type_ground=1
type_character=2

Dim temp_vertex(4,4)

camera=CreateCamera()
PositionEntity camera,0,10,-10

light=CreateLight()
RotateEntity light,90,0,0

; Create tree mesh (upper half)
tree=CreateMesh()
PositionMesh tree,0,1.5,0

width#=3
height#=3

For i=1 To 50 Step 10
        For j=1 To 50 Step 10
                Local surface=CreateSurface(tree)
                temp_vertex(0,0)=AddVertex(surface,i-width#,0,j-height#)
                temp_vertex(0,1)=AddVertex(surface,i-width#,0,j+height#)
                temp_vertex(1,0)=AddVertex(surface,i+width#,0,j-height#)
                temp_vertex(1,1)=AddVertex(surface,i+width#,0,j+height#)
                VertexTexCoords surface,temp_vertex(0,0),0,1,0
                VertexTexCoords surface,temp_vertex(0,1),0,0,0
                VertexTexCoords surface,temp_vertex(1,0),1,1,0
                VertexTexCoords surface,temp_vertex(1,1),1,0,0
                AddTriangle(surface,temp_vertex(0,0),temp_vertex(0,1),temp_vertex(1,1))
                AddTriangle(surface,temp_vertex(1,1),temp_vertex(1,0),temp_vertex(0,0))
        Next
Next
UpdateNormals tree
EntityType tree,type_ground

Player=CreateCube()
PositionEntity player,-7,0,-4
EntityType player,type_character

Collisions type_character,type_ground,2,3

While Not KeyDown( 1 )

MoveEntity player,0.1,0,0.1
PointEntity camera,player

UpdateWorld
RenderWorld

Draw_Wire_2D(tree,camera,255,0,0)

Flip

Wend

End

Function Draw_Wire_2D(mesh,cam,red=0,grn=0,blu=0)
        Color red,grn,blu
        If EntityInView(mesh,cam)=False Then Return
        cnt=CountSurfaces(mesh)
        For a=1 To cnt
                surf=GetSurface(mesh,a)
                For tri=0 To CountTriangles(surf)-1
                        TFormPoint VertexX(surf,TriangleVertex(surf,tri,0)),VertexY(surf,TriangleVertex(surf,tri,0)),VertexZ(surf,TriangleVertex(surf,tri,0)),mesh,0
                        CameraProject(cam,TFormedX(),TFormedY(),TFormedZ())
                        sx1=ProjectedX()
                        sy1=ProjectedY()
                        TFormPoint VertexX(surf,TriangleVertex(surf,tri,1)),VertexY(surf,TriangleVertex(surf,tri,1)),VertexZ(surf,TriangleVertex(surf,tri,1)),mesh,0
                        CameraProject(cam,TFormedX(),TFormedY(),TFormedZ())
                        sx2=ProjectedX()
                        sy2=ProjectedY()
                        TFormPoint VertexX(surf,TriangleVertex(surf,tri,2)),VertexY(surf,TriangleVertex(surf,tri,2)),VertexZ(surf,TriangleVertex(surf,tri,2)),mesh,0
                        CameraProject(cam,TFormedX(),TFormedY(),TFormedZ())
                        sx3=ProjectedX()
                        sy3=ProjectedY()
                        If Check_Cull_2D(sx1,sy1,sx2,sy2,sx3,sy3)<0
                                Line sx1,sy1,sx2,sy2
                                Line sx2,sy2,sx3,sy3
                                Line sx3,sy3,sx1,sy1       
                        End If
                Next                       
        Next
End Function

Function Check_Cull_2D(x1,y1,x2,y2,x3,y3)
        Return (x1-x2)*(y3-y2)-(y1-y2)*(x3-x2)
End Function



Почему коллизия не действует на добавленные к мешу трианглы?

Примечание: кубик Player ударяется в стенку в позиции 0,0,0 радиусом 1

Кто знает RMFLoader 0.08 (загрузчик карт редактора Valve Hammer Editor), то там уровень строится по трианглам. И коллизия действует.
Сам сравнить код пока затрудняюсь, так как там он сильно развлетвлён.

Решение - ниже.

LLI.T.A.L.K.E.R. 20.03.2011 03:08

Ответ: Вопрос-Ответ (для новичков)
 
Как и предполагал: "коллизия не действовала, потому что модель была плоска относительно объекту." Повернул трианглы вертикально - теперь сталкивается. Теперь ручками придётся рисовать кубы и модельки.

Рисунок: http://s51.radikal.ru/i132/1103/90/a7334abd7668.jpg

Код:

; AddMesh Example
; ---------------

Graphics3D 640,480
SetBuffer BackBuffer()

type_ground=1
type_character=2

Dim temp_vertex(4,4)

camera=CreateCamera()
PositionEntity camera,-10,10,-10

light=CreateLight()
RotateEntity light,90,0,0

; Create tree mesh (upper half)
Global tree=CreateMesh()
PositionMesh tree,0,1.5,0
Global surface=CreateSurface(tree)

width#=3
height#=3

For i=1 To 50 Step 8
        For j=1 To 50 Step 10
                temp_vertex(0,0)=AddVertex(surface,i-width#,-1,j-height#)
                temp_vertex(0,1)=AddVertex(surface,i-width#,-1,j+height#)
                temp_vertex(1,0)=AddVertex(surface,i-width#,2,j-height#)
                temp_vertex(1,1)=AddVertex(surface,i-width#,2,j+height#)
                VertexTexCoords surface,temp_vertex(0,0),0,1,0
                VertexTexCoords surface,temp_vertex(0,1),0,0,0
                VertexTexCoords surface,temp_vertex(1,0),1,1,0
                VertexTexCoords surface,temp_vertex(1,1),1,0,0
                AddTriangle(surface,temp_vertex(0,0),temp_vertex(0,1),temp_vertex(1,1))
                AddTriangle(surface,temp_vertex(1,1),temp_vertex(1,0),temp_vertex(0,0))
        Next
Next
UpdateNormals tree
EntityType tree,type_ground

Player=CreateCube()
PositionEntity Player,-7,0,-10
EntityType Player,type_character

Collisions type_character,type_ground,2,2

While Not KeyDown( 1 )

MoveEntity player,0.1,0,0.1
PointEntity camera,player

UpdateWorld
RenderWorld

Draw_Wire_2D(tree,camera,255,0,0)

Flip

Wend

End

Function Draw_Wire_2D(mesh,cam,red=0,grn=0,blu=0)
        Color red,grn,blu
        If EntityInView(mesh,cam)=False Then Return
        cnt=CountSurfaces(mesh)
        For a=1 To cnt
                surf=GetSurface(mesh,a)
                For tri=0 To CountTriangles(surf)-1
                        TFormPoint VertexX(surf,TriangleVertex(surf,tri,0)),VertexY(surf,TriangleVertex(surf,tri,0)),VertexZ(surf,TriangleVertex(surf,tri,0)),mesh,0
                        CameraProject(cam,TFormedX(),TFormedY(),TFormedZ())
                        sx1=ProjectedX()
                        sy1=ProjectedY()
                        TFormPoint VertexX(surf,TriangleVertex(surf,tri,1)),VertexY(surf,TriangleVertex(surf,tri,1)),VertexZ(surf,TriangleVertex(surf,tri,1)),mesh,0
                        CameraProject(cam,TFormedX(),TFormedY(),TFormedZ())
                        sx2=ProjectedX()
                        sy2=ProjectedY()
                        TFormPoint VertexX(surf,TriangleVertex(surf,tri,2)),VertexY(surf,TriangleVertex(surf,tri,2)),VertexZ(surf,TriangleVertex(surf,tri,2)),mesh,0
                        CameraProject(cam,TFormedX(),TFormedY(),TFormedZ())
                        sx3=ProjectedX()
                        sy3=ProjectedY()
                        If Check_Cull_2D(sx1,sy1,sx2,sy2,sx3,sy3)<0
                                Line sx1,sy1,sx2,sy2
                                Line sx2,sy2,sx3,sy3
                                Line sx3,sy3,sx1,sy1       
                        End If
                Next                       
        Next
End Function

Function Check_Cull_2D(x1,y1,x2,y2,x3,y3)
        Return (x1-x2)*(y3-y2)-(y1-y2)*(x3-x2)
End Function


RegIon 20.03.2011 12:12

Ответ: Вопрос-Ответ (для новичков)
 
LLI.T.A.L.K.E.R....ет ты кому написал...если мне,ТО У МЯ КОСЯКИ ФИЗИКИ......

LLI.T.A.L.K.E.R. 20.03.2011 12:23

Ответ: Вопрос-Ответ (для новичков)
 
Это я себе задачку решал: создание меша путём добавления трианглов и последующей коллизии.
Так же теперь допёр как правильно нужно делать AddMesh (а то не совсем правильно понял Blitz-help и был косяк с коллизией)

Вот тут окончательный тест по этой теме:

Код:

; AddMesh Example
; ---------------

Graphics3D 640,480
SetBuffer BackBuffer()

type_ground=1
type_character=2

Dim temp_vertex(4,4)

camera=CreateCamera()
PositionEntity camera,-10,10,-10

light=CreateLight()
RotateEntity light,90,0,0

; Create tree mesh (upper half)
Global tree=CreateMesh()
Global surface=CreateSurface(tree)

width#=3
height#=3

For i=1 To 50 Step 8
        For j=1 To 50 Step 10
                temp_vertex(0,0)=AddVertex(surface,i-width#,-1,j-height#)
                temp_vertex(0,1)=AddVertex(surface,i-width#,-1,j+height#)
                temp_vertex(1,0)=AddVertex(surface,i-width#,2,j-height#)
                temp_vertex(1,1)=AddVertex(surface,i-width#,2,j+height#)
                VertexTexCoords surface,temp_vertex(0,0),0,1,0
                VertexTexCoords surface,temp_vertex(0,1),0,0,0
                VertexTexCoords surface,temp_vertex(1,0),1,1,0
                VertexTexCoords surface,temp_vertex(1,1),1,0,0
                AddTriangle(surface,temp_vertex(0,0),temp_vertex(0,1),temp_vertex(1,1))
                AddTriangle(surface,temp_vertex(1,1),temp_vertex(1,0),temp_vertex(0,0))
        Next
Next
UpdateNormals tree
EntityType tree,type_ground

Cube=CreateCube()
PositionMesh Cube,-3,0,-5

AddMesh Cube,tree
FreeEntity Cube

Player=CreateCube()
PositionEntity Player,-7,0,-10
EntityType Player,type_character

Collisions type_character,type_ground,2,2

While Not KeyDown( 1 )

MoveEntity player,0.1,0,0.1
PointEntity camera,player

UpdateWorld
RenderWorld

Draw_Wire_2D(tree,camera,255,0,0)

Flip

Wend

End

Function Draw_Wire_2D(mesh,cam,red=0,grn=0,blu=0)
        Color red,grn,blu
        If EntityInView(mesh,cam)=False Then Return
        cnt=CountSurfaces(mesh)
        For a=1 To cnt
                surf=GetSurface(mesh,a)
                For tri=0 To CountTriangles(surf)-1
                        TFormPoint VertexX(surf,TriangleVertex(surf,tri,0)),VertexY(surf,TriangleVertex(surf,tri,0)),VertexZ(surf,TriangleVertex(surf,tri,0)),mesh,0
                        CameraProject(cam,TFormedX(),TFormedY(),TFormedZ())
                        sx1=ProjectedX()
                        sy1=ProjectedY()
                        TFormPoint VertexX(surf,TriangleVertex(surf,tri,1)),VertexY(surf,TriangleVertex(surf,tri,1)),VertexZ(surf,TriangleVertex(surf,tri,1)),mesh,0
                        CameraProject(cam,TFormedX(),TFormedY(),TFormedZ())
                        sx2=ProjectedX()
                        sy2=ProjectedY()
                        TFormPoint VertexX(surf,TriangleVertex(surf,tri,2)),VertexY(surf,TriangleVertex(surf,tri,2)),VertexZ(surf,TriangleVertex(surf,tri,2)),mesh,0
                        CameraProject(cam,TFormedX(),TFormedY(),TFormedZ())
                        sx3=ProjectedX()
                        sy3=ProjectedY()
                        If Check_Cull_2D(sx1,sy1,sx2,sy2,sx3,sy3)<0
                                Line sx1,sy1,sx2,sy2
                                Line sx2,sy2,sx3,sy3
                                Line sx3,sy3,sx1,sy1       
                        End If
                Next                       
        Next
End Function

Function Check_Cull_2D(x1,y1,x2,y2,x3,y3)
        Return (x1-x2)*(y3-y2)-(y1-y2)*(x3-x2)
End Function



Теперь будет не много мелких объектов, а один глобальный.

Из этого понял, что
PositionEntity - помещает скин, но не сам объект
PositionMesh - помещает объект со всеми его свойствами

LLI.T.A.L.K.E.R. 30.03.2011 13:23

Ответ: Вопрос-Ответ (для новичков)
 
Ogre3D Wrapper for Blitz3D
Example01 вылетает с МАВ (Windows 7)

Дебаг выдаёт проблемное место:
PHP код:

файл root.bb

    
Function SetMediaDir
        строка o_addResourceLocation 

Просьба проверить Ogre3D на Windows 7
и направить на путь исправления
ошибки

Вот исходники O3d+B3d

На WinXP ошибок не выдаёт.

IgorOK 30.03.2011 16:54

Ответ: Вопрос-Ответ (для новичков)
 
Как узнать директорию запуска приложения Blitz3D если приложение вызывалось перетаскиванием на него файла?

UPD:

Через функцию SystemProperty("appdir")

RlexGm 29.05.2011 11:39

Ответ: Вопрос-Ответ (для новичков)
 
Как сделать синхронизацию в игре на Blitz3D и ещё сделать реальное время т.е. например 3000 в игре - равно реальным 3 секундам..
Прошу прощенья, если этот вопрос уже где то был:)

pepel 29.05.2011 12:04

Ответ: Вопрос-Ответ (для новичков)
 
синхронизация игры и фпс 60 :

PHP код:

Graphics 640,480,16,2

Const UPS=60

period
=1000/UPS
time
=MilliSecs()-period

Repeat
    Repeat
        elapsed
=MilliSecs()-time
    Until elapsed    
    ticks
=elapsed/period
    tween
#=Float(elapsed Mod period)/Float(period)
    
    
For k=1 To ticks
        time
=time+period    
        
If KeyHit(1End    
    Next
    
    Flip
    Cls
Forever 

а команда MilliSecs() - это милисекунды

pepel 29.05.2011 12:37

Ответ: Вопрос-Ответ (для новичков)
 
PHP код:

Graphics3D 640,480,16,2



Const UPS=60

cub
=CreateCube()
cam=CreateCamera()
PositionEntity cam,0,0,-10

period
=1000/UPS
time
=MilliSecs()-period

Repeat
    Repeat
        elapsed
=MilliSecs()-time
    Until elapsed    
    ticks
=elapsed/period
    tween
#=Float(elapsed Mod period)/Float(period)

    

    
    
For k=1 To ticks
        time
=time+period
        
;Здесь код циклла
        TurnEntity cub
,0,0,1
        
        
If KeyHit(1End    
    Next

    

    RenderWorld 
()
    
Flip
    Cls

Forever 

попробуй поменять значение UPS и увидишь разницу)

LLI.T.A.L.K.E.R. 05.06.2011 00:00

Ответ: Вопрос-Ответ (для новичков)
 
В скором времени попробую изобретать велосипеды на Б3Д:

тупо вводишь в поисковике "исходник игры ..." - шашки, точки, пятнашки, крестики-нолики и т.п. (без ИИ)
изучаешь код - переводишь в 3Д на Б3Д


и опыт, и исходники другим, и прикольно

RegIon 05.06.2011 06:38

Ответ: Вопрос-Ответ (для новичков)
 
Цитата:

В скором времени попробую изобретать велосипеды на Б3Д:

тупо вводишь в поисковике "исходник игры ..." - шашки, точки, пятнашки, крестики-нолики и т.п. (без ИИ)
изучаешь код - переводишь в 3Д на Б3Д


и опыт, и исходники другим, и прикольно
я ща движку соберу на С,таким макаром на портативку игры и проги портировать стараться буду

RlexGm 06.06.2011 11:15

Ответ: Вопрос-Ответ (для новичков)
 
Такой вопрос, b3d сравнивает переменные string$?
У меня такой код:
PHP код:

If EnterKey$="2317499356"

Regfile=OpenFile("data\maps\7\file.vs")
WriteLine(regfile,"ab729c")
CloseFile(regfile)
click=0
Else

EnterKey$=""
SimKol=0
click
=0
EndIf 

PHP код:

Text centrw,centrh-50,"Press key",True,True
Text centrw
,centrh,EnterKey$,True,True
If SimKol<=10

If KeyHit(2Then EnterKey$=EnterKey$+"1":SimKol=SimKol+1
If KeyHit(3Then EnterKey$=EnterKey$+"2":SimKol=SimKol+1
If KeyHit(4Then EnterKey$=EnterKey$+"3":SimKol=SimKol+1
If KeyHit(5Then EnterKey$=EnterKey$+"4":SimKol=SimKol+1
If KeyHit(6Then EnterKey$=EnterKey$+"5":SimKol=SimKol+1
If KeyHit(7Then EnterKey$=EnterKey$+"6":SimKol=SimKol+1
If KeyHit(8Then EnterKey$=EnterKey$+"7":SimKol=SimKol+1
If KeyHit(9Then EnterKey$=EnterKey$+"8":SimKol=SimKol+1
If KeyHit(10Then EnterKey$=EnterKey$+"9":SimKol=SimKol+1
If KeyHit(11Then EnterKey$=EnterKey$+"0":SimKol=SimKol+1

EndIf 

Суть заключается в том, что когда будет введена переменная, и нажата кнопка будет сравнение набранной переменной с строковыми цифрами.Если набрано правильно, то в файл должна записаться строка.
Но когда набираешь правильно, то записи в файл не происходит.Просто всё стирается.Скажите пожалуйста в чём проблема.

RegIon 06.06.2011 11:25

Ответ: Вопрос-Ответ (для новичков)
 
нашёл как сделать, можно инпутом....


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

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