#1 04.02.2005 07:40:24

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Seltsame Verschiebung von Materialien

Hi!

Ich dachte, ich könnte Euch jetzt eine Zeitlang in Ruhe lassen, brauche jedoch nochmal Eure Hilfe  :down:

Also. *ähem*

Ich habe meine Planeten mit einer Double-Sphere gemacht, eine Kugel in einer Kugel, beide bei 0/0/0 also mittig.

In der Darstellung wandern die jedoch mit zunehmendem Radius (Rotation um 0/0/0, da ist die Sonne) immer weiter auseinander.

Hier mal 2 Screens:

Naher Planet (geringer Radius):
http://www.ericbehme.de/bilder/nah.jpg

Weit entferneter Planet (größter Radius):
http://www.ericbehme.de/bilder/fern.jpg

Wie man sieht, sind die Wolken nicht genau auf dem Planeten, was ich absolut nicht verstehe  :? Und je weiter der Planet entfernt ist, desto mehr verschiebt sich das. Und zwar in Richtung Sonne (0/0/0), das sieht man am zweiten Screen recht schön.

Habe schon versucht, das manuell zu beheben, wenn Planet weiter entfernt ist, Wolken-Material etwas weiter nach außen, aber das ist schwierig. Wo kommt das her?

Mein Code Darstellung Planeten:

Code:

procedure TCommandoForm.draw_planets(booltext:boolean);
var _i : longint;
    i:   integer;
    x,y,z: single;
    dwCaps: DWORD;
    v: TD3DXVector3;
    fogstart,fogend,fogdensity: single;
    var matTmp: TD3DXMatrix;
begin
  with xenscreen.Device do begin
    for i:=1 to 31 do
    for _i:=0 to 1 do begin
      // Set the material for the subset.
      //erst die farbwerte festlegen, dann das material
      planetMeshMaterials[_i].Ambient.r:=(0.7-i/90)*planettyp[i].nRMul;
      planetMeshMaterials[_i].Ambient.g:=(0.7-i/90)*planettyp[i].ngMul;
      planetMeshMaterials[_i].Ambient.b:=(0.7-i/90)*planettyp[i].nbMul;
      planetMeshMaterials[_i].Diffuse.r:=(0.5)*planettyp[i].nRMul;
      planetMeshMaterials[_i].Diffuse.g:=(0.5)*planettyp[i].nGMul;
      planetMeshMaterials[_i].Diffuse.b:=(0.5)*planettyp[i].nBMul;
      planetMeshMaterials[_i].Specular.r:=(0.5)*planettyp[i].nRMul;
      planetMeshMaterials[_i].Specular.g:=(0.5)*planettyp[i].nGMul;
      planetMeshMaterials[_i].Specular.b:=(0.5)*planettyp[i].nBMul;
      planetMeshMaterials[_i].Emissive.r:=(1-i/90)*planettyp[i].nRMul;
      planetMeshMaterials[_i].Emissive.g:=(1-i/90)*planettyp[i].nGMul;
      planetMeshMaterials[_i].Emissive.b:=(1-i/90)*planettyp[i].nBMul;
      SetMaterial(planetMeshMaterials[_i]);
      // Set the texture for the subset.
      //////////////////// Glow-Mapping ////////////////////// Streufarbe und Texturfarbe modulieren
      if _i=0 then begin
        //Oberflächen-Textur
        setrenderstate(d3drs_alphablendenable,dword(false));
        SetTexture(0,planet3d[i].texture);
        SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE);
        SetTextureStageState(0,D3DTSS_COLORARG2,D3DTA_DIFFUSE);
        SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_Modulate);
      end;
      if _i=1 then begin
        //Wolken-Textur
        setrenderstate(d3drs_alphablendenable,dword(true));
//        SetTexture(0,planet3d[i].texture);
        SetTexture(0,planetMeshTexture);
        setrenderstate(d3drs_alphablendenable,dword(true));
        setrenderstate(d3drs_srcblend,d3dblend_srcalpha);
        //setrenderstate(d3drs_destblend,d3dblend_invsrcalpha);
        setrenderstate(d3drs_destblend,d3dblend_one);
        SetTextureStageState(0,D3DTSS_colorarg1,d3dta_texture);
        SetTextureStageState(0,D3DTSS_colorarg2,d3dta_diffuse);
        SetTextureStageState(0,D3DTSS_colorOP,D3DTOP_modulate);
      end;
      if i>1 then begin
        D3DXMatrixRotationY(planet3d[i].matrot,planet3d[i].nweite/600*(_i+1));
        x:=cos(planet3d[i].nweite/planet3d[nchosenplanet].nRotSpeed)*planet3d[i].nRotX;
        z:=sin(planet3d[i].nweite/planet3d[nchosenplanet].nRotSpeed)*planet3d[i].nRotX;
        y:=32-i*2;
      end else
      if i=1 then begin
        D3DXMatrixRotationY(planet3d[i].matrot,0);
        x:=0;
        y:=0;
        z:=0;
      end;
      planet3d[i].x:=x;
      planet3d[i].y:=y;
      planet3d[i].z:=z;
      D3DXMatrixTranslation(planet3d[i].matxyz,x,y,z);
      D3DXMatrixMultiply(matTmp, planet3d[i].matrot, planet3d[i].matxyz);
      //Skalieren
      mattmp._11 := mattmp._11 * planettyp[i].nradius/5000; 
      mattmp._12 := mattmp._12 * planettyp[i].nradius/5000;
      mattmp._13 := mattmp._13 * planettyp[i].nradius/5000;
      mattmp._21 := mattmp._21 * planettyp[i].nradius/5000;
      mattmp._22 := mattmp._22 * planettyp[i].nradius/5000;
      mattmp._23 := mattmp._23 * planettyp[i].nradius/5000;
      mattmp._31 := mattmp._31 * planettyp[i].nradius/5000;
      mattmp._32 := mattmp._32 * planettyp[i].nradius/5000;
      mattmp._33 := mattmp._33 * planettyp[i].nradius/5000;
      //if i=1 then D3DXMatrixScaling(planet3d[i].matxyz,planettyp[i].nradius/5000,planettyp[i].nradius/5000,planettyp[i].nradius/5000); //größer skalieren
      xenscreen.Device.SetTransform(D3DTS_WORLD,mattmp);
      planetMesh.DrawSubset(_i);
      if i>1 then inc(planet3d[i].nweite);
    end;
    for i:=1 to 5 do begin
      SetMaterial(ring3d[i].g_pMeshMaterials[0]);
      SetTexture(0,ring3d[i].g_pMeshTextures[0]);
      SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE);
      SetTextureStageState(0,D3DTSS_COLORARG2,D3DTA_DIFFUSE);
      SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_Modulate);
      D3DXMatrixRotationY(ring3d[i].matrot,planet3d[i*6].nweite/1200);
      D3DXMatrixMultiply(ring3d[i].mat,ring3d[i].matrot, planet3d[i*6].matxyz);
      xenscreen.Device.SetTransform(D3DTS_WORLD,ring3d[i].mat);
      ring3d[i].g_pMesh.DrawSubset(0);
    end;
    setrenderstate(d3drs_alphablendenable,dword(false));
    if booltext then begin
      xenscreen.Device.setrenderstate(d3drs_fogenable,0);
end;



Mein Code für die Kamera:

Code:

procedure TCommandoForm.Set_Camera;
var
  matWorld, matView, matProj : TD3DMatrix;
  V1, V2, V3: TD3DVector;
  var matTmp: TD3DXMatrix;
  var ndistx,ndistz,ndistx2,ndistz2,ndistcamera: extended;
begin
  // Set up our view matrix. A view matrix can be defined given an eye point,
  // a point to lookat, and a direction for which way is up. Here, we set the
  // eye five units back along the z-axis and up three units, look at the
  // origin, and define "up" to be in the y-direction.
  if (scene=d3dmap) or (scene=d3dintro) then begin
    if nchosenplanet>1 then begin
      ndistcamera:=planet3d[2].nrotx-50;
      ndistx:=cos((planet3d[nchosenplanet].nweite)/planet3d[nchosenplanet].nRotSpeed+(0.1+xdist/100)*ndistcamera/planet3d[nchosenplanet].nrotx)*(planet3d[nchosenplanet].nrotx+35+zdist);
      ndistz:=sin((planet3d[nchosenplanet].nweite)/planet3d[nchosenplanet].nRotSpeed+(0.1+xdist/100)*ndistcamera/planet3d[nchosenplanet].nrotx)*(planet3d[nchosenplanet].nrotx+35+zdist);
      nDestCamX1:=ndistX;
      nDestCamY1:=32-nchosenplanet*2;
      nDestCamZ1:=nDistZ;
    end else begin
      ndistcamera:=0;
      ndistx:=50;
      ndistz:=50;
      nDestCamX1:=ndistX;
      nDestCamY1:=0;
      nDestCamZ1:=nDistZ;
    end;
  end
  else begin
    if nresttimer<120 then begin
      ndistcamera&#58;=planet3d&#91;2&#93;.nrotx-50;
      ndistx&#58;=cos&#40;planet3d&#91;nchosenplanet&#93;.nweite/planet3d&#91;nchosenplanet&#93;.nRotSpeed&#41;*&#40;planet3d&#91;nchosenplanet&#93;.nrotx+25&#41;;
      ndistz&#58;=sin&#40;planet3d&#91;nchosenplanet&#93;.nweite/planet3d&#91;nchosenplanet&#93;.nRotSpeed&#41;*&#40;planet3d&#91;nchosenplanet&#93;.nrotx+25&#41;;
    end;
    if nresttimer>=120 then begin
      if nresttimer=120 then ncameratime&#58;=50;
      ndistcamera&#58;=planet3d&#91;2&#93;.nrotx-250;
      //position
      ndistx&#58;=cos&#40;&#40;planet3d&#91;nchosenplanet&#93;.nweite-25&#41;/planet3d&#91;nchosenplanet&#93;.nRotSpeed+&#40;0.1+xdist/100&#41;*ndistcamera/planet3d&#91;nchosenplanet&#93;.nrotx&#41;*&#40;planet3d&#91;nchosenplanet&#93;.nrotx+30&#41;;
      ndistz&#58;=sin&#40;&#40;planet3d&#91;nchosenplanet&#93;.nweite-25&#41;/planet3d&#91;nchosenplanet&#93;.nRotSpeed+&#40;0.1+xdist/100&#41;*ndistcamera/planet3d&#91;nchosenplanet&#93;.nrotx&#41;*&#40;planet3d&#91;nchosenplanet&#93;.nrotx+30&#41;;
      //Blickwinkel
      ndistx2&#58;=cos&#40;&#40;planet3d&#91;nchosenplanet&#93;.nweite&#41;/planet3d&#91;nchosenplanet&#93;.nRotSpeed&#41;*&#40;planet3d&#91;nchosenplanet&#93;.nrotx&#41;;
      ndistz2&#58;=sin&#40;&#40;planet3d&#91;nchosenplanet&#93;.nweite&#41;/planet3d&#91;nchosenplanet&#93;.nRotSpeed&#41;*&#40;planet3d&#91;nchosenplanet&#93;.nrotx&#41;;
      nDestCamx2&#58;=ndistx2;
      nDestCamy2&#58;=32-nchosenplanet*2;
      nDestCamz2&#58;=ndistz2;
    end;
    nDestCamX1&#58;=ndistX;
    nDestCamY1&#58;=32-nchosenplanet*2;
    nDestCamZ1&#58;=nDistZ;
  end;
  if ncameratime>1 then dec&#40;ncameratime&#41;;
  if nschwenktime>1 then dec&#40;nschwenktime&#41;;
  V1&#58;=D3DXVector3&#40;nCurrCamX1,nCurrCamy1,nCurrCamZ1&#41;;
  if nCurrcamX1<nDestCamX1 then nCurrcamX1&#58;=nCurrCamX1+abs&#40;nCurrCamx1-nDestcamx1&#41;/nCameratime;
  if nCurrcamX1>nDestCamX1 then nCurrcamX1&#58;=nCurrCamX1-abs&#40;nCurrCamx1-nDestcamx1&#41;/nCameratime;
  if nCurrcamY1<nDestCamY1 then nCurrcamY1&#58;=nCurrCamY1+abs&#40;nCurrCamy1-nDestcamy1&#41;/nCameratime;
  if nCurrcamY1>nDestCamY1 then nCurrcamY1&#58;=nCurrCamY1-abs&#40;nCurrCamy1-nDestcamy1&#41;/nCameratime;
  if nCurrcamZ1<nDestCamZ1 then nCurrcamZ1&#58;=nCurrCamZ1+abs&#40;nCurrCamz1-nDestcamz1&#41;/nCameratime;
  if nCurrcamZ1>nDestCamZ1 then nCurrcamZ1&#58;=nCurrCamZ1-abs&#40;nCurrCamz1-nDestcamz1&#41;/nCameratime;
  V2&#58;=D3DXVector3&#40;nCurrCamX2,nCurrCamy2,nCurrCamZ2&#41;;
  if nCurrcamX2<nDestCamX2 then nCurrcamX2&#58;=nCurrCamX2+abs&#40;nCurrCamx2-nDestcamx2&#41;/nSchwenktime;
  if nCurrcamX2>nDestCamX2 then nCurrcamX2&#58;=nCurrCamX2-abs&#40;nCurrCamx2-nDestcamx2&#41;/nSchwenktime;
  if nCurrcamY2<nDestCamY2 then nCurrcamY2&#58;=nCurrCamY2+abs&#40;nCurrCamy2-nDestcamy2&#41;/nSchwenktime;
  if nCurrcamY2>nDestCamY2 then nCurrcamY2&#58;=nCurrCamY2-abs&#40;nCurrCamy2-nDestcamy2&#41;/nSchwenktime;
  if nCurrcamZ2<nDestCamZ2 then nCurrcamZ2&#58;=nCurrCamZ2+abs&#40;nCurrCamz2-nDestcamz2&#41;/nSchwenktime;
  if nCurrcamZ2>nDestCamZ2 then nCurrcamZ2&#58;=nCurrCamZ2-abs&#40;nCurrCamz2-nDestcamz2&#41;/nSchwenktime;
  //v2&#58;=D3DXVector3&#40;ndistx/10,0,ndistz/10&#41;;
  V3 &#58;= D3DXVector3&#40; 0.0, 1, 0.0 &#41;;
  D3DXMatrixLookAtLH&#40; matView, V1, V2, V3 &#41;;
  xenscreen.Device.SetTransform&#40;D3DTS_VIEW, matView &#41;;
end;



Kann mir jemand sagen, woher das kommt?

Hier noch meine Doublesphere:
http://www.ericbehme.de/download/doublesphere.x

Hilfeeee!  :rock:

Vielen Dank für Eure Tips.

Firle

Offline

 

#2 04.02.2005 13:42:01

Chris
ExtremeMember
Ort: Erlangen, Bay
Registriert: 24.01.2005
Beiträge: 694
Web-Seite

Re: Seltsame Verschiebung von Materialien

ich hab jetzt deinen code nicht gelesen
aber es sieht irgendwie so aus also wäre irgendetwas
nicht ganz 0 was eigentlich 0 sein sollte...
hm...
komme am sonntag wieder da schau ichs mir mal an
wenns nicht jemand vorher schon gelöst hat...

setzte doch die wolkenkugel erst nach dem positionieren der planetenkugel auf die gleiche pos wie die Planetenkugel...

mfg Chris


Nimm meinen Rat an - ich brauch ihn sowieso nicht

Offline

 

#3 04.02.2005 13:53:14

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Re: Seltsame Verschiebung von Materialien

Hmmm. Tue ich ja eigentlich, in der For Schleife wird ja für die Matrix das gleiche für beide Materialien gesetzt. Das ist ja gerade so seltsam, dass die dann auseinanderlaufen...

Habe verschiedenes probiert, ich glaube auch ohne Rotation, weil das ja der einzige Unterschied ist.

Ich verstehe es nicht.

Firle

Offline

 

#4 04.02.2005 15:15:33

artzuk
GodlikeMember
Ort: Leipzig
Registriert: 24.01.2005
Beiträge: 1164

Re: Seltsame Verschiebung von Materialien

Hat deine Kugel - also der mesh - auch genau den Mittelpunkt in 0|0|0?

Der Fehler kommt mir bekannt vor, komme aber grad nicht auf die wirkliche Lösung - wenn ich die überhaupt noch wo im Speicher hab big_smile


Mein kleiner .NET Blog: http://artzuk-interactive.de/

Offline

 

#5 04.02.2005 15:24:08

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Re: Seltsame Verschiebung von Materialien

Hi Artzuk,

ich guck nochmal nach, das X-File hängt auch am Thread, aber die sollte die Mitte bei 0/0/0 haben!

Bin bis Montag oder Dienstag offline, schönes Wochenende!

Firle

Offline

 

#6 04.02.2005 15:27:05

Coolcat
ProGuru
Ort: Aachen, NRW
Registriert: 24.01.2005
Beiträge: 2780
Web-Seite

Re: Seltsame Verschiebung von Materialien

Mit zu nehmender Entfernung wird der ZBuffer immer ungenauer, ab einer gewissen entfernung sind dann zwei fast gleiche Entfernungen gleich...

1. Lösung: Entfernung zwischen Near- und FarClip-Plane so kurz wie möglich. Dadurch sollte der ZBuffer genauer werden.

2. Lösung (eventuelle beides kombinieren):
Falls du nur einen 16bit ZBuffer benutzt, setze ihn mal auf 32bit:
D3dpp.AutoDepthStencilFormat := D3DFMT_D32;
(vorher gucken ob deine GraKa das kann...)

Coolcat


My software never has bugs. It just develops random features.

Offline

 

#7 04.02.2005 15:29:37

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Re: Seltsame Verschiebung von Materialien

Hi Coolcat,

verstehe das mit 1 nicht? Die äußere Kugel ist nur minimal größer als die innere, die Position der beiden ist die gleiche.

Das bei 2 probiere ich mal, danke sehr!  big_smile

Firle

Offline

 

#8 04.02.2005 15:37:46

Coolcat
ProGuru
Ort: Aachen, NRW
Registriert: 24.01.2005
Beiträge: 2780
Web-Seite

Re: Seltsame Verschiebung von Materialien

FarClip Plane (maximale Sichtweite, also z.B. alles was weiter als 500.0 Einheiten weg ist wird nich mehr gerendert)
NearClip Plane (minimale Sichtweite, alles was näher als z.B. 1.0 Einheit ist wird nicht mehr dargestellt)

Der ZBuffer (darin werden die Tiefeninfos für alle Faces gespeichert) verteilt sich jetzt auf diese 500 - 1 = 499 Einheiten.
Wenn du jetzt das FarClipPlane auf 250 stellst, sind es nur noch 249 Einheiten und der ZBuffer könnte wesentlich genauer sein.
Nachteil: Deine Sichtweite ist natürlich geringer und bei dir kommt es wohl auf die Sichtweite an....


Coolcat


My software never has bugs. It just develops random features.

Offline

 

#9 04.02.2005 15:47:40

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Re: Seltsame Verschiebung von Materialien

Aha, schau ich mal. Danke!

Firle

Offline

 

#10 08.02.2005 08:37:41

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Re: Seltsame Verschiebung von Materialien

Hallo,

habe jetzt meine Doublesphere gelöscht, und eine normale Sphere also nur 1 Material (1 Kugel) erstellt. Erst zeichne ich die normal, mit Oberflächen-Textur, dann skaliere ich minimal größer, und zeichne die Wolke. Die blöde Verschiebung bei weiter entfernten Planeten bleibt trotzdem die gleiche.   :? Also am Objekt kann es nicht mehr liegen...

Dann habe ich alles ein bisschen kleiner gemacht und alles aneinandergerückt, und bei der View-Matrix die Sichtweite verringert.
Bin so von sichtweite 2000 auf 1200 runter, brauche große sichtweite, weil die Planeten ja eine gewisse entfernung zur Sonne brauchen und da noch andere Sachen rum und durchfliegen. Hat auch nix gebracht.

Und die Umstellung des Stencilbuffers auf 32 bit scheint DX8.1 nicht zu kennen, das geht also auch nicht.

Weitere Ideen?
Danke für die Tips.

Firle

Offline

 

#11 08.02.2005 09:25:27

Coolcat
ProGuru
Ort: Aachen, NRW
Registriert: 24.01.2005
Beiträge: 2780
Web-Seite

Re: Seltsame Verschiebung von Materialien

versuch mal die Mipmaps komplett auszuschalten.

Coolcat


My software never has bugs. It just develops random features.

Offline

 

Brett Fußzeile

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson