Bewegung auf der Kugel

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

Haubitze

Betreff: Bewegung auf der Kugel

BeitragDo, Okt 01, 2009 3:57
Antworten mit Zitat
Benutzer-Profile anzeigen
nunja noch arbeite ich an meinenm kleinen planeten Smile

hier mal die neue version mit einigen kleinen aenderungen. (vorsicht die models und texturen sind nicht
enthalten)

Main.bb
Code: [AUSKLAPPEN]
Include "includes\functions.bb"
Include "includes\geosphere.bb"
Global x#,y#,z#,azimu#,incli#
SeedRnd(MilliSecs())
Graphics3D 800,600,0,0
SetBuffer BackBuffer()
; Variables
mousespeed#=0.1
cameraspeed#=0.00
camerasmoothness#=10
scaler#=1000.0

timer=CreateTimer(60)
planet = subdiv(planet)
planet = subdiv(planet)
planet = subdiv(planet)
planet = subdiv(planet)
EntityType planet, 2, 1
EntityRadius planet, scaler
PositionEntity planet,0,0,0
EntityColor planet,0,32,32
EntityFX planet,16
ScaleEntity planet,scaler,scaler,scaler
planetobj=createpivot()
;EntityParent planet,planetobj
UpdateNormals(planet)

;berge machen
For s = 0 To CountSurfaces(planet)
surface%=GetSurface(planet, i+1)
For j=1 To CountVertices(GetSurface(planet, 1)) Step 1
VertexCoords surface%, j, VertexX (surface%, j)-Rnd(0.0,0.02*VertexNX(surface%,j)),VertexY (surface%, j)-Rnd(0.0,0.02*VertexNY(surface%,j)),VertexZ (surface%, j)-Rnd(0.0,0.02*VertexNZ(surface%,j))
Next
Next
FlipMesh(planet)
UpdateNormals(planet)


;wolken
wolken=CreateSphere(8)
PositionEntity wolken,0,-250,0
ScaleEntity wolken,1500,1500,1500
EntityColor wolken,128,128,128
EntityFX wolken,16
EntityBlend wolken,3
EntityAlpha wolken,0.5
RotateEntity wolken,0,0,90
skytex=LoadTexture("data\clouds.jpg")
EntityTexture wolken,skytex

; Camera
mitte=createpivot()
PositionEntity mitte,0,0,0
mitteobj=createpivot()
PositionEntity mitteobj,0,0,0
player =createpivot(mitte)
EntityParent player, mitte, 1
EntityType player, 1
EntityRadius player, 0.1
PositionEntity player,0,1500,0
cam=CreateCamera(player)
EntityParent cam, player, 0
PositionEntity cam,0,17.5,0
CameraRange cam,0.01,10000

;licht
light0 = CreateLight(1,planetobj)
RotateEntity light0, 90, 0, 0
LightColor light0, 255, 255, 125

light1 = CreateLight(1,planetobj)
RotateEntity light1, -90, 0, 0
LightColor light1, 32, 32, 255


MoveMouse GraphicsWidth()/2,GraphicsHeight()/2

Dim gras(399)                      ;gras setzen
gras(0) = createcube(mitteobj)
For i=1 To 399     
gras(i)=copyentity(gras(0))
RotateEntity mitteobj, Rnd(0.0,360.0),Rnd(0.0,360.0),Rnd(0.0,360.0)
PositionEntity gras(i),0,1000,0
EntityParent gras(i),mitteobj
EntityColor gras(i),0,125,0
;EntityFX gras(i),1+16
Next

Dim busch(399)                      ;buesche setzen
busch(0) = LoadMesh ("data\testbusch.b3d",mitteobj)
For i=1 To 399     
busch(i)=copyentity(busch(0))
RotateEntity mitteobj, Rnd(0.0,360.0),Rnd(0.0,360.0),Rnd(0.0,360.0)
PositionEntity busch(i),0,997,0
ScaleEntity busch(i),4,4,4
EntityParent busch(i),mitteobj
EntityColor busch(i),0,125,64
;EntityFX gras(i),1+16
Next

Dim baum(399)                      ;baeume setzen
baum(0) = LoadMesh ("data\testtree.b3d",mitteobj)
For i=1 To 399     
baum(i)=copyentity(baum(0))
RotateEntity mitteobj, Rnd(0.0,360.0),Rnd(0.0,360.0),Rnd(0.0,360.0)
PositionEntity baum(i),0,1000,0
ScaleEntity baum(i),10,20,10
EntityParent baum(i),mitteobj
EntityColor baum(i),255,125,0
;EntityFX baum(i),1+16
Next



;set up fps counter
fps_milli=MilliSecs(): fps_counter=0: update_frequency=10
Collisions 1, 2, 2, 2
   
While Not KeyHit(1)
   
    If EntityCollided(player, 0) <> 0 Then  ;schwerkraft?
      MoveEntity player,-(DistX(player,mitte))/1000+10.0,-(DistY(player,mitte))/1000+10.0,-(DistZ(player,mitte))/1000+10.0   
    Else
      MoveEntity player,-(DistX(player,mitte))/1000,-(DistY(player,mitte))/1000,-(DistZ(player,mitte))/1000
    End If

    If KeyHit(59) Then wf=1-wf : WireFrame wf
   
   ; Mousecam
   mx#=CurveValue(MouseXSpeed()*mousespeed,mx,camerasmoothness)
   my#=CurveValue(MouseYSpeed()*mousespeed,my,camerasmoothness)
   MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
   pitch#=EntityPitch(cam)
   yaw#=EntityYaw(player)
   pitch=pitch+my
   yaw=yaw-mx
   If pitch>89 Then pitch=89
   If pitch<-89 Then pitch=-89
    rotateEntity player,0,yaw,0
   rotateEntity cam,pitch,0,0
   
    If KeyDown(57) Then MoveEntity player,0,10,0  ;Springen
   If KeyDown(31) Then  ;rueckwaerts
   azimu#=-Cos(yaw)
   incli#=-Sin(yaw)
  Else If KeyDown(17) Then  ;vorwaerts
   azimu#=cos(yaw)
   incli#=Sin(yaw)
  Else If KeyDown(32) Then   ;rechts
   azimu#=Sin(yaw)
   incli#=-cos(yaw)
   Else If  KeyDown(30) Then  ;links
   azimu#=-Sin(yaw)
   incli#=Cos(yaw)
   Else
   azimu#=0
   incli#=0
   EndIf

  turnEntity mitte, azimu#/10.0, 0.0, incli#/10.0    ;bewege player
   RotateEntity planetobj,0,0,MilliSecs()/100.0

   UpdateWorld()   
   RenderWorld()
   
      Text 0, 0,"Rendered Triangles:"+ TrisRendered()
    ; fps counter
      fps_counter=fps_counter+1
      If fps_counter=update_frequency
     fps=1000/Float(((MilliSecs()-fps_milli))/update_frequency)
     fps_milli=MilliSecs()
     fps_counter=0
      endif
      ; print fps
      Text 750,0,"FPS:"+fps   
   Text 0,20,"surfaces:"+CountSurfaces(planet)+"vertices"+CountVertices(GetSurface(planet, 1))
    WaitTimer timer
    Flip
   
Wend

FreeTimer(timer)
End


Functions.bb
Code: [AUSKLAPPEN]
; Smoothcam
Function CurveValue#(newvalue#,oldvalue#,increments )
   If increments>1 oldvalue#=oldvalue#-(oldvalue#-newvalue#)/increments
      If increments<=1 oldvalue=newvalue
         Return oldvalue#
End Function


Function DistX#(a%, b%)
   distx# = EntityX# (a%)-EntityX#(b%)
  Return distx#
End Function

Function DistY#(a%, b%)
   disty# = EntityY# (a%)-EntityY#(b%)
  Return disty#
End Function

Function DistZ#(a%, b%)
   distz# = EntityZ# (a%)-EntityZ#(b%)
  Return distz#
End Function


geosphere.bb (diese habe ich aus dem codearchiev)
Code: [AUSKLAPPEN]
;Graphics3D 800,600,0,0
planet = CreateMesh()
wolken = CreateMesh()
;top = CreateSurface(planet)
;mdl = CreateSurface(planet)
;bot = CreateSurface(planet)
surf= CreateSurface(planet)
Global rbrush = CreateBrush(255,0,0)
Global gbrush = CreateBrush(0,255,0)
Global bbrush = CreateBrush(0,0,255)
;PaintSurface(top, rbrush)
;PaintSurface(mdl, gbrush)
;PaintSurface(bot, bbrush)

;ScaleEntity(planet, 100, 100, 100);

a# = 0.5
b# = 1.0 / (1.0 + Sqr(5.0))

;01 0  b -a    b  a  0   -b  a  0
;surf=mdl
v1 = vertndx(surf, 0,b,-a)
v2 = vertndx(surf, b,a,0)
v3 = vertndx(surf, -b,a,0)
AddTriangle(surf,v1,v2,v3)
;02 0  b  a   -b  a  0    b  a  0
;surf=mdl
v1 = vertndx(surf, 0,b,a)
v2 = vertndx(surf, -b,a,0)
v3 = vertndx(surf, b,a,0)
AddTriangle(surf,v1,v2,v3)
;03 0  b  a    0 -b  a   -a  0  b
;surf=mdl
v1 = vertndx(surf, 0,b,a)
v2 = vertndx(surf, 0,-b,a)
v3 = vertndx(surf, -a,0,b)
AddTriangle(surf,v1,v2,v3)
;04 0  b  a    a  0  b    0 -b  a
;surf=top
v1 = vertndx(surf, 0,b,a)
v2 = vertndx(surf, a,0,b)
v3 = vertndx(surf, 0,-b,a)
AddTriangle(surf,v1,v2,v3)
;05 0  b -a    0 -b -a    a  0 -b
;surf=mdl
v1 = vertndx(surf, 0,b,-a)
v2 = vertndx(surf, 0,-b,-a)
v3 = vertndx(surf, a,0,-b)
AddTriangle(surf,v1,v2,v3)
;06 0  b -a   -a  0 -b    0 -b -a
;surf=bot
v1 = vertndx(surf, 0,b,-a)
v2 = vertndx(surf, -a,0,-b)
v3 = vertndx(surf, 0,-b,-a)
AddTriangle(surf,v1,v2,v3)
;07 0 -b  a    b -a  0   -b -a  0
;surf=mdl
v1 = vertndx(surf, 0,-b,a)
v2 = vertndx(surf, b,-a,0)
v3 = vertndx(surf, -b,-a,0)
AddTriangle(surf,v1,v2,v3)
;08 0 -b -a   -b -a  0    b -a  0
;surf=mdl
v1 = vertndx(surf, 0,-b,-a)
v2 = vertndx(surf, -b,-a,0)
v3 = vertndx(surf, b,-a,0)
AddTriangle(surf,v1,v2,v3)
;09 -b a  0   -a  0  b   -a  0 -b
;surf=bot
v1 = vertndx(surf, -b,a,0)
v2 = vertndx(surf, -a,0,b)
v3 = vertndx(surf, -a,0,-b)
AddTriangle(surf,v1,v2,v3)
;10 -b-a  0   -a  0 -b   -a  0  b
;surf=bot
v1 = vertndx(surf, -b,-a,0)
v2 = vertndx(surf, -a,0,-b)
v3 = vertndx(surf, -a,0,b)
AddTriangle(surf,v1,v2,v3)
;11 b  a  0    a  0 -b    a  0  b
;surf=top
v1 = vertndx(surf, b,a,0)
v2 = vertndx(surf, a,0,-b)
v3 = vertndx(surf, a,0,b)
AddTriangle(surf,v1,v2,v3)
;12 b -a  0    a  0  b    a  0 -b
;surf=top
v1 = vertndx(surf, b,-a,0)
v2 = vertndx(surf, a,0,b)
v3 = vertndx(surf, a,0,-b)
AddTriangle(surf,v1,v2,v3)
;13 0  b  a   -a  0  b   -b  a  0
;surf=mdl
v1 = vertndx(surf, 0,b,a)
v2 = vertndx(surf, -a,0,b)
v3 = vertndx(surf, -b,a,0)
AddTriangle(surf,v1,v2,v3)
;14 0  b  a    b  a  0    a  0  b
;surf=top
v1 = vertndx(surf, 0,b,a)
v2 = vertndx(surf, b,a,0)
v3 = vertndx(surf, a,0,b)
AddTriangle(surf,v1,v2,v3)
;15 0  b -a   -b  a  0   -a  0 -b
;surf=bot
v1 = vertndx(surf, 0,b,-a)
v2 = vertndx(surf, -b,a,0)
v3 = vertndx(surf, -a,0,-b)
AddTriangle(surf,v1,v2,v3)
;16 0  b -a    a  0 -b    b  a  0
;surf=mdl
v1 = vertndx(surf, 0,b,-a)
v2 = vertndx(surf, a,0,-b)
v3 = vertndx(surf, b,a,0)
AddTriangle(surf,v1,v2,v3)
;17 0 -b -a   -a  0 -b   -b -a  0
;surf=bot
v1 = vertndx(surf, 0,-b,-a)
v2 = vertndx(surf, -a,0,-b)
v3 = vertndx(surf, -b,-a,0)
AddTriangle(surf,v1,v2,v3)
;18 0 -b -a    b -a  0    a  0 -b
;surf=mdl
v1 = vertndx(surf, 0,-b,-a)
v2 = vertndx(surf, b,-a,0)
v3 = vertndx(surf, a,0,-b)
AddTriangle(surf,v1,v2,v3)
;19 0 -b  a   -b -a  0   -a  0  b
;surf=mdl
v1 = vertndx(surf, 0,-b,a)
v2 = vertndx(surf, -b,-a,0)
v3 = vertndx(surf, -a,0,b)
AddTriangle(surf,v1,v2,v3)
;20 0 -b  a    a  0  b    b -a  0
;surf=top
v1 = vertndx(surf, 0,-b,a)
v2 = vertndx(surf, a,0,b)
v3 = vertndx(surf, b,-a,0)
AddTriangle(surf,v1,v2,v3)

UpdateNormals(planet)


Global newmesh
Global newsurf

Type subdivvect
   Field x#
   Field y#
   Field z#
End Type

Function subdiv(mesh)
   newmesh = CreateMesh()
   For i=1 To CountSurfaces(mesh)
      subdivsurf(GetSurface(mesh,i))
   Next
   FreeEntity mesh
   Return newmesh
End Function

Function subdivsurf(surf)
   newsurf = CreateSurface(newmesh)
   tris = CountTriangles(surf)-1
   For i=0 To tris
      c1.subdivvect = spherize(GetCoords(surf,TriangleVertex(surf,i,0)))
      c2.subdivvect = spherize(GetCoords(surf,TriangleVertex(surf,i,1)))
      c3.subdivvect = spherize(GetCoords(surf,TriangleVertex(surf,i,2)))
      c4.subdivvect = spheresplit(c1,c2)
      c5.subdivvect = spheresplit(c2,c3)
      c6.subdivvect = spheresplit(c3,c1)
      Vects2Triangle(c1,c4,c6)
      Vects2Triangle(c4,c2,c5)
      Vects2Triangle(c5,c3,c6)
      Vects2Triangle(c4,c5,c6)
   Next
End Function

Function spheresplit.subdivvect(c1.subdivvect, c2.subdivvect)
   res.subdivvect = New subdivvect
   res\x# = (c1\x# + c2\x#)/2.0
   res\y# = (c1\y# + c2\y#)/2.0
   res\z# = (c1\z# + c2\z#)/2.0
   res = spherize(res)
   Return res
End Function

Function spherize.subdivvect(c.subdivvect)
   res.subdivvect = New subdivvect
   d# = 1.0/Sqr(c\x#*c\x# + c\y#*c\y# + c\z#*c\z#)
   res\x# = c\x# * d#
   res\y# = c\y# * d#
   res\z# = c\z# * d#
   Return res
End Function

Function GetCoords.subdivvect(surf, vert)
   res.subdivvect = New subdivvect
   res\x# = VertexX#(surf,vert)
    res\y# = VertexY#(surf,vert)
   res\z# = VertexZ#(surf,vert)
   Return res
End Function

Function Vects2Triangle(c1.subdivvect,c2.subdivvect,c3.subdivvect)
   v1 = vertindex(newsurf, c1)
   v2 = vertindex(newsurf, c2)
   v3 = vertindex(newsurf, c3)
   AddTriangle(newsurf, v1, v2, v3)
End Function

Function vertindex(surf, c.subdivvect)
   verts = CountVertices(surf) - 1
   For i=0 To verts
      If VertexX#(surf,i)=c\x# And VertexY#(surf,i)=c\y# And VertexZ#(surf,i)=c\z#
         Return i
      EndIf
   Next
   Return AddVertex(surf, c\x#, c\y#, c\z#)
End Function

Function vertndx(surf, x#,y#,z#)
   verts = CountVertices(surf) - 1
   For i=0 To verts
      If VertexX#(surf,i)=x# And VertexY#(surf,i)=y# And VertexZ#(surf,i)=z#
         Return i
      EndIf
   Next
   Return AddVertex(surf, x#, y#, z#)
End Function


ach ja nun habe ich natuerlich ein neues problem Embarassed

und zwar wenn ich nun die laufe und dann stehen bleibe rutsch ich ja nach "unten" dabei verschiebt sich,
so nehme ich zumindest an, der player-pivot und ist somit nicht mehr "senkrecht" zum mitte-pivot. hoffe man versteht mich. (wenn ihr ne weile steht und immer bissi rutscht dann seht ihr was ich meine)

ich schau natuerlich ob ich es loesen kann und wenn nich naja muss ich halt spaeter mal fragen.

gruesse
  • Zuletzt bearbeitet von Haubitze am Sa, Okt 03, 2009 1:08, insgesamt 2-mal bearbeitet

FireballFlame

Betreff: Re: Bewegung auf der Kugel

BeitragDo, Okt 01, 2009 5:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo und willkommen hier im Forum!

Mir ist leider noch nicht ganz klar, was du erreichen willst.
Die Winkel deiner Kamera (und jedes anderen 3D-Objektes) kannst du jedenfalls mit EntityPitch, EntityYaw und EntityRoll auslesen.
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit
 

Haubitze

BeitragDo, Okt 01, 2009 5:46
Antworten mit Zitat
Benutzer-Profile anzeigen
ja klasse wie einfach das doch geht und ich denke mal wieder an hohe mathematik Very Happy
hier mal mein movement

Code: [AUSKLAPPEN]
 MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
   pitch#=EntityPitch(cam)
   yaw#=EntityYaw(cam)
   If pitch>89 Then pitch=89
   If pitch<-89 Then pitch=-89
   RotateEntity cam,0,yaw,0
   TurnEntity cam,pitch,0,0

    ; Movement
    If KeyDown(205)
    cameraspeed#=.01
    Else If KeyDown(203)
    cameraspeed#=-.01
    Else cameraspeed#=0
    EndIf
    If KeyDown(200)
    cameraspeed#=.01
    Else If KeyDown(208)
    cameraspeed#=-.01
    Else
    cameraspeed#=0
    EndIf
   
    cx#=sin(yaw)*cameraspeed;*10
    cz#=cos(yaw)*cameraspeed;*10
    turnEntity mitte,Sin(cz)*180,0,Sin(cx)*180

wobei die entity mitte der besagt pivot ist und cam die camera

naja deiner is dan doch effizienter Wink

vielen dank fuer die hilfe. jetzt werd ich mal schaun ob ich ein "strafe" noch dazubekomm Smile
 

Haubitze

BeitragDo, Okt 01, 2009 7:21
Antworten mit Zitat
Benutzer-Profile anzeigen
hm ich habe nun noch einen 3 pivot gesetz der meinen "player darstellt. eigendlich tut er nix ausser die cammera tragen :/ naja is ja erstmal wursch.

ich habe nun ein "strafe drin kann mich mit der maus umschaun... soweit klappt das ganz gut.

einziges problem ist das wenn ich auf der kugel laufe und mich dann umschaue dann "renn ich ueber die ganze kugel. weis nit wie ich sagen soll

hier mal mein aktueller code
Code: [AUSKLAPPEN]
Graphics3D 800,600,0,0
SetBuffer BackBuffer()
; Variables
mousespeed#=0.1
cameraspeed#=0.00
camerasmoothness#=10
scaler#=1000.0

;timer=CreateTimer(512)
planet = createsphere(60)
UpdateNormals(planet)
EntityType planet, 2, 1
EntityRadius planet, scaler
PositionEntity planet,0,0,0
EntityFX planet,16
ScaleEntity planet,scaler,scaler,scaler

; Camera
mitte=createpivot()
PositionEntity mitte,0,0,0
mitteobj=createpivot()
PositionEntity mitteobj,0,0,0
player =createpivot(mitte)
EntityParent player, mitte, 1
EntityType player, 1
EntityRadius player, 0.1
PositionEntity player,0,1500,0
cam=CreateCamera(player)
EntityParent cam, player, 0
PositionEntity cam,0,17.5,0
CameraRange cam,0.01,10000



MoveMouse GraphicsWidth()/2,GraphicsHeight()/2

Dim cube(99)
cube(0) = createcube(mitteobj)
;EntityFX cuber,1+16
For i=1 To 99
cube(i)=copyentity(cube(0))
PositionEntity cube(i),Sin(Rand(1001))*1001,Sin(Rand(1001))*1001,Sin(Rand(1001))*1001
Next

 
While Not KeyHit(1)
   Collisions 1, 2, 1, 2
   
    If EntityCollided(player, 0) = 0
       MoveEntity player,-(DistX(player,mitte))/1000,-(DistY(player,mitte))/1000,-(DistZ(player,mitte))/1000
    End If
   
    If KeyHit(57) Then wf=1-wf : WireFrame wf
   
   ; Mousecam
   mx#=CurveValue(MouseXSpeed()*mousespeed,mx,camerasmoothness)
   my#=CurveValue(MouseYSpeed()*mousespeed,my,camerasmoothness)
   MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
   pitch#=EntityPitch(cam)
   yaw#=EntityYaw(mitte)
   pitch=pitch+my
   yaw=yaw-mx
   If pitch>89 Then pitch=89
   If pitch<-89 Then pitch=-89
   ;rotateEntity mitte,0,yaw,0
   rotateEntity cam,pitch,0,0
   

   
  If KeyDown(32) Then
   cameraspeedz#=   cameraspeedz#-0.1
   Else If KeyDown(30) Then
   cameraspeedz#=   cameraspeedz#+0.1
  Else If KeyDown(17) Then
   cameraspeedx#=   cameraspeedx#+0.1
   Else If KeyDown(31) Then
   cameraspeedx#=   cameraspeedx#-0.1
   EndIf
   rotateEntity mitte,cameraspeedx,yaw,cameraspeedz#

    UpdateWorld()   
   RenderWorld()
   
    col = CountCollisions(cam)
   Text 0, 0, "Kollision(en):"
   Text 300, 0, "1. Kollision mit:" + EntityCollided(planet, 1)
   For i = 1 To col
      Text 000, i * 20, "Entity=" + CollisionEntity(planet, i)
      Text 150, i * 20, "Surface=" + CollisionSurface(planet, i)
      Text 300, i * 20, "Triangle=" + CollisionTriangle(planet, i)
         Text 450, i * 20, "Zeit=" + CollisionTime(planet, i)   
         Text 500, 140, "NX=" + CollisionNX(planet, i)
         gravx=CollisionNX(cam, i)
         gravy=CollisionNY(cam, i)
         gravz=CollisionNZ(cam, i)
   Next
            Text 0, 100, "DistX=" + DistX(player,mitte)
            Text 0, 120, "DistY=" + DistY(player,mitte)
            Text 0, 140, "DistZ=" + DistZ(player,mitte)

           Text 0, 160, "winkelX=" + EntityRoll(mitte)
            Text 0, 180, "winkelY=" + EntityPitch(mitte)
            Text 0, 200, "winkelZ=" + EntityYaw(mitte)
   localChar = GetKey()
   If localChar > 0 Then
      currentText$ = Chr$(localChar)
      ascii = localChar
   EndIf
   Text 0, 240, "ASCII Code: " + ascii
   Text 0, 260, "Eingegebener Buchstabe: " + currentText$
   ;WaitTimer timer
   
   Flip
   
Wend

End

; Smoothcam
Function CurveValue#(newvalue#,oldvalue#,increments )
   If increments>1 oldvalue#=oldvalue#-(oldvalue#-newvalue#)/increments
      If increments<=1 oldvalue=newvalue
         Return oldvalue#
End Function


Function DistX#(a%, b%)
   distx# = EntityX# (a%)-EntityX#(b%)
  Return distx#
End Function

Function DistY#(a%, b%)
   disty# = EntityY# (a%)-EntityY#(b%)
  Return disty#
End Function

Function DistZ#(a%, b%)
   distz# = EntityZ# (a%)-EntityZ#(b%)
  Return distz#
End Function
   


mit wasd laufen und mit space wiremode ein/aus schalten

jemand ne idee was ich falsch mache?

giebt es eine funktion um die rotationsmatrix eines entity's zu resetten?
also damit zb die y-achse immer nach oben zeigt.

gruesse
 

Haubitze

BeitragDo, Okt 01, 2009 22:43
Antworten mit Zitat
Benutzer-Profile anzeigen
nun gut, habe mal bissi gegooglet und bin auf das spherische koordinatensystem gestossen.

zamit ist es moeglich mit dem radius r und 2 winkeln die position anzugeben. habe auch schon die umrechnungsfunktionen dafuer.

Code: [AUSKLAPPEN]
Function SphereToCartesianX#(r#,inc#,az#) ;az=0<azimut<360 grad
tmp#= r# * Sin(inc#) * Cos(az#)                             ;inc=0<inclination<180 grad
Return tmp#                                                             ;r=radius
End Function

Function SphereToCartesianZ#(r#,inc#,az#)
tmp#= r# * Sin(inc#) * Sin(az#)   
Return tmp#
End Function

Function SphereToCartesianY#(r#,inc#,az#)
tmp#= r# * Cos(inc#)
Return tmp#
End Function


somit ist es mir nun moeglich mit winkeln und einem radius die xyz koordinaten zu errechnen.
das klappt auch super solange ich in eine richtung schaue. sobald ich mich aber umschaue ist die richtung nicht korrect.

haette jemand ne idee wie ich das yaw der cammera in diese formel einbauen muss damit die richtungen wieder stimmen.

fuer vorschlaege schon mal ein danke im vorraus.

ComNik

BeitragDo, Okt 01, 2009 22:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Genereller Tipp: Vermeide Doppel bzw Trippel Posts. Nutze lieber die Edit Funktion und hebe hervor was du verändert hast. Das spart Energie und Nerven der Mods^^

Willkommen im Forum btw!
lg
ComNik
WIP: Vorx.Engine
 

Haubitze

BeitragDo, Okt 01, 2009 22:50
Antworten mit Zitat
Benutzer-Profile anzeigen
oh recht hast du werds mir fuer die zukunft merken Wink


habe im ersten post mal den aktuellen stand drinnen.
 

Meik

BeitragFr, Okt 02, 2009 16:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich weiss nicht woran das lag aber ich bin nachdem ich eine weile nur geradeaus gelaufen bin durch den "Boden" gefallen und konnte innerhalb vom Planeten laufen. Konnte den Fehler aber nicht nochmal absichtlich nachmachen.
 

Haubitze

BeitragFr, Okt 02, 2009 20:26
Antworten mit Zitat
Benutzer-Profile anzeigen
ja das problem habe ich ja auch.

und zwar habe ich ja diesen pivot in der mitte, der player wird immer zu diesem hingezogen.
das einzige was den player daran hindert in die kugel zu fallen ist die kollisionsabfrage zwischen ihm und der kugel.

habe nun aber auch keine idee wie ich das umgehen kann.

koennte da ein timer helfen der den flip immer in mindestens der zeit macht wie die collisionsberechnung braucht?

Arrangemonk

BeitragFr, Okt 02, 2009 23:03
Antworten mit Zitat
Benutzer-Profile anzeigen
du kannst den fall auch verhindern indem der beim kleinsten radius der kugel grundsätzlich aufhört
einfach nur
if object.z < radius
object.z --
(pseudocode) den radius machst halt so, dass er noch überm normallevel vom objekt is aber nicht sichtbarund für schluchten brauchst halt dann blocking volumes
bei bergen könnt er dann theoretisch noch durchfallen
aber wenn der mesh in ordnung is(keine cuts oder offene stellen) müssts gehen
alternativ ginge noch ein collitionsmesh, der für kollition optimiert ist und keine cuts hat (smoothing groups und textur schnitte) und unsichtbar is
ingeneur

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group