#1 31.01.2005 08:08:24

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

Eine Handvoll AnfängerFragen

Gudden Tach!

Ich hätte da mal einige Fragen, da es hier noch so leer ist, hau ich die mal grad alle rein.  big_smile

Ich bin noch ziemlicher Anfänger, daher wären ausführliche Antworten sehr nett, wenn ihr etwas Zeit habt. vielen Dank schonmal.

1

Ich habe in meiner Planetmap 30 Planeten.
Meine Lade-Routine:

Code:

function TForm1.Load_planets: boolean; // Tutorial 6 - Step 1 
var _pAdjacency, _pD3DXMtrlBuffer : ID3DXBuffer; 
    _d3dxMaterials : PD3DXMaterial; 
    _i : longint; 
    i: integer; 
begin 
  Result:= false; 
  // Load mesh. 
  _pAdjacency := NIL; 
  _pD3DXMtrlBuffer := NIL; 
  for i:=1 to 31 do begin 
    //D3DXMatrixTranslation(planet3d[i].matXYZ,planet3d[i].nstartx,planet3d[i].nstarty,planet3d[i].nstartz); 
    D3DXMatrixTranslation(planet3d[i].matRot,0,0,0); 
    //if i=1 then 
    if failed(D3DXLoadMeshFromX(pChar(Planet3d[i].sMeshFileName), D3DXMESH_SYSTEMMEM, 
                              OmegaScreen1.Device, @_pAdjacency, @_pD3DXMtrlBuffer, 
                              @Planet3d[i].NumMaterials, Planet3d[i].g_pMesh)) then exit; 
  {  if i>1 then begin 
      //Planet3d[1].g_pMesh.clonemesh(D3DXMESH_SYSTEMMEM,@_pD3DXMtrlBuffer,OmegaScreen1.Device,Planet3d[i].g_pMesh); 
      D3DXLoadMeshFromXInMemory(pbyte(planet3d[1].g_pMesh),sizeof(Planet3d[1].g_pMesh),D3DXMESH_SYSTEMMEM, 
                              OmegaScreen1.Device, @_pAdjacency, @_pD3DXMtrlBuffer, 
                              @Planet3d[i].NumMaterials, Planet3d[i].g_pMesh); 
      Planet3d[i].NumMaterials:=Planet3d[1].NumMaterials; 
    end;    } 
    _pAdjacency := NIL; 
    if Planet3d[i].NumMaterials = 0 then exit; 
    // After loading the mesh object and material information, 
    // we need to extract the material properties and texture 
    // names from the material buffer. 
    _d3dxMaterials := _pD3DXMtrlBuffer.GetBufferPointer; 
    // Creates new mesh and texture objects based on the total 
    // number of materials for the mesh. 
    try 
      SetLength(planet3d[i].g_pMeshMaterials, Planet3d[i].NumMaterials); 
      SetLength(planet3d[i].g_pMeshTextures, Planet3d[i].NumMaterials); 
    except 
      exit; 
    end; 

  // Load materials and textures. 
  for _i := 0 to Planet3d[i].NumMaterials - 1 do 
    begin 
      // Copy the material 
      planet3d[i].g_pMeshMaterials[_i] := _d3dxMaterials^.MatD3D; 
      // Set the ambient color for the material (D3DX does not do this) 
      //planet3d[i].g_pMeshMaterials[_i].Ambient:=planet3d[i].g_pMeshMaterials[_i].Diffuse; 
      if i>1 then begin 
        planet3d[i].g_pMeshMaterials[_i].Ambient.r:=(0.7-i/90)*planettyp[i].nRMul; 
        planet3d[i].g_pMeshMaterials[_i].Ambient.g:=(0.7-i/90)*planettyp[i].ngMul; 
        planet3d[i].g_pMeshMaterials[_i].Ambient.b:=(0.7-i/90)*planettyp[i].nbMul; 
        planet3d[i].g_pMeshMaterials[_i].Diffuse.r:=(0.5)*planettyp[i].nRMul; 
        planet3d[i].g_pMeshMaterials[_i].Diffuse.g:=(0.5)*planettyp[i].nGMul; 
        planet3d[i].g_pMeshMaterials[_i].Diffuse.b:=(0.5)*planettyp[i].nBMul; 
        planet3d[i].g_pMeshMaterials[_i].Specular.r:=(0.5)*planettyp[i].nRMul; 
        planet3d[i].g_pMeshMaterials[_i].Specular.g:=(0.5)*planettyp[i].nGMul; 
        planet3d[i].g_pMeshMaterials[_i].Specular.b:=(0.5)*planettyp[i].nBMul; 
        planet3d[i].g_pMeshMaterials[_i].Emissive.r:=(1-i/90)*planettyp[i].nRMul; 
        planet3d[i].g_pMeshMaterials[_i].Emissive.g:=(1-i/90)*planettyp[i].nGMul; 
        planet3d[i].g_pMeshMaterials[_i].Emissive.b:=(1-i/90)*planettyp[i].nBMul; 
        {if _I=0 then 
        planet3d[i].g_pMeshMaterials[_i].power:=0 
        else 
        planet3d[i].g_pMeshMaterials[_i].power:=1;} 
      end 
      else begin 
        planet3d[i].g_pMeshMaterials[_i].Ambient.r:=1; 
        planet3d[i].g_pMeshMaterials[_i].Ambient.g:=1; 
        planet3d[i].g_pMeshMaterials[_i].Ambient.b:=1; 
        planet3d[i].g_pMeshMaterials[_i].Diffuse.r:=1; 
        planet3d[i].g_pMeshMaterials[_i].Diffuse.g:=1; 
        planet3d[i].g_pMeshMaterials[_i].Diffuse.b:=1; 
        planet3d[i].g_pMeshMaterials[_i].Specular.r:=1; 
        planet3d[i].g_pMeshMaterials[_i].Specular.g:=1; 
        planet3d[i].g_pMeshMaterials[_i].Specular.b:=1; 
        planet3d[i].g_pMeshMaterials[_i].Emissive.r:=1; 
        planet3d[i].g_pMeshMaterials[_i].Emissive.g:=1; 
        planet3d[i].g_pMeshMaterials[_i].Emissive.b:=1; 
        if _i>0 then begin 
          planet3d[i].g_pMeshMaterials[_i].Ambient.g:=0; 
          planet3d[i].g_pMeshMaterials[_i].Ambient.b:=0; 
          planet3d[i].g_pMeshMaterials[_i].Diffuse.g:=0; 
          planet3d[i].g_pMeshMaterials[_i].Diffuse.b:=0; 
          planet3d[i].g_pMeshMaterials[_i].Specular.g:=0; 
          planet3d[i].g_pMeshMaterials[_i].Specular.b:=0; 
          planet3d[i].g_pMeshMaterials[_i].Emissive.g:=0; 
          planet3d[i].g_pMeshMaterials[_i].Emissive.b:=0; 
        end; 
      end; 
      // Create the texture. 
      planet3d[i].g_pMeshTextures[_i] := NIL; 
      if _i=0 then _d3dxMaterials^.pTextureFilename:=pansichar(planet3d[i].stexturename) 
      else _d3dxMaterials^.pTextureFilename:=pansichar('cloud.jpg'); 
//      end; 
      if (_d3dxMaterials^.pTextureFilename = NIL) or 
         (failed(D3DXCreateTextureFromFile(OmegaScreen1.Device, 
                 _d3dxMaterials^.pTextureFilename, 
                 planet3d[i].g_pMeshTextures[_i]))) 
        then planet3d[i].g_pMeshTextures[_i] := NIL; 
      // Next 
      inc(_d3dxMaterials); 
    end; 
  // Done with the material buffer 
  _pD3DXMtrlBuffer := NIL; 
end; 
  // All right. 
  Result := true; 
end; 



Ich lade 30x das DirectX X-File, weil ich nicht weiß, wie ich es einfach kopiere. Dauert natürlich lange.
Ich habe dann versucht, mit
D3DXLoadMeshFromXInMemory
oder
Planet3d[1].g_pMesh.clonemesh

mir das Teil zu kopieren, nachdem ich den ersten geladen habe. Aber das funzt irgendwie nicht.

Ich kriege bei beiden Fällen eine Zugriffsverletzung hier:
_d3dxMaterials := _pD3DXMtrlBuffer.GetBufferPointer;

Wie kann ich einfach einen Mesh kopieren? Die Planeten haben alle
unterschiedliche Texturen, aber die Objekte sind die gleichen.

2

Mein Sternentor ist eine Art Ring als ein X-Objekt, da ist eine Scheibe drin, dies ist ein Extra X Objekt (ganz dünne runde Scheibe die in den Ring passt). Wenn ein Raumschiff aus dem Sternentor kommt, soll es einen dicken Rumms geben und die Scheibe soll leuchten oder blitzen oder wobbeln etc. Wie kriege ich das hin? Ich habe da mal was aufgeschnappt, 'Volumetric lighting'. Hilft mir sowas? Wie mache ich das, mit einem Volumetric fog und dann ein Licht dahinterpacken?

3

Ich habe ein hübsches Raumschiff als X-Objekt, und das hat bisher 2 Materialien (Hülle und Fenster). Habe mal extra keine Texturen drauf. Ich hätte die Hülle gerne Metallisch-Gläzend, aber die hat jetzt nur ein helles Grau (mit Abstufungen und Schatten, das ist ok) und sieht aus wie Plastik.

Wie kriege ich ein metallisches Glänzen und Reflektieren hin? Habe am Licht und Material rumgespielt, hat aber nix gebracht, auch Specualr brachte kein metallisches Glänzen.

So lade ich mein Raumschiff:

Code:

function TCommandoForm.load_raumschiff: boolean;
var _pAdjacency, _pD3DXMtrlBuffer : ID3DXBuffer;
    _d3dxMaterials : PD3DXMaterial;
    _i : longint;
    i: integer;
begin
  raumschiff.nweite:=0;
  Result := false;
  _pAdjacency := NIL;
  _pD3DXMtrlBuffer := NIL;
  D3DXMatrixTranslation(raumschiff.matRot,0,0,0);
  if failed(D3DXLoadMeshFromX(pChar(raumschiff.sMeshFileName), D3DXMESH_SYSTEMMEM,
                              xenScreen.Device, @_pAdjacency, @_pD3DXMtrlBuffer,
                              @raumschiff.NumMaterials, raumschiff.g_pMesh)) then exit;
  _pAdjacency := NIL;
  if raumschiff.NumMaterials = 0 then exit;

  _d3dxMaterials := _pD3DXMtrlBuffer.GetBufferPointer;
  try
    SetLength(raumschiff.g_pMeshMaterials, raumschiff.NumMaterials);
    SetLength(raumschiff.g_pMeshTextures, raumschiff.NumMaterials);
  except
    exit;
  end;
  for _i := 0 to raumschiff.NumMaterials - 1 do
  begin
    raumschiff.g_pMeshMaterials[_i] := _d3dxMaterials^.MatD3D;
    if _i=0 then begin
      raumschiff.g_pMeshMaterials[_i].Emissive.r:=0.5;
      raumschiff.g_pMeshMaterials[_i].Emissive.g:=0.5;
      raumschiff.g_pMeshMaterials[_i].Emissive.b:=0.5;
      raumschiff.g_pMeshMaterials[_i].Emissive.a:=0.5;
      raumschiff.g_pMeshMaterials[_i].Ambient.r:=0.5;
      raumschiff.g_pMeshMaterials[_i].ambient.g:=0.5;
      raumschiff.g_pMeshMaterials[_i].ambient.b:=0.5;
      raumschiff.g_pMeshMaterials[_i].ambient.a:=0.5;
      raumschiff.g_pMeshMaterials[_i].diffuse.r:=0.5;
      raumschiff.g_pMeshMaterials[_i].diffuse.g:=0.5;
      raumschiff.g_pMeshMaterials[_i].diffuse.b:=0.5;
      raumschiff.g_pMeshMaterials[_i].diffuse.a:=0.5;
      raumschiff.g_pMeshMaterials[_i].specular.r:=1;
      raumschiff.g_pMeshMaterials[_i].specular.g:=1;
      raumschiff.g_pMeshMaterials[_i].specular.b:=1;
      raumschiff.g_pMeshMaterials[_i].specular.a:=1;
      raumschiff.g_pMeshMaterials[_i].power:=50;
    end else begin
      raumschiff.g_pMeshMaterials[_i].Emissive.r:=0.5;
      raumschiff.g_pMeshMaterials[_i].Emissive.g:=0.5;
      raumschiff.g_pMeshMaterials[_i].Emissive.b:=1;
      raumschiff.g_pMeshMaterials[_i].Ambient.r:=0.5;
      raumschiff.g_pMeshMaterials[_i].ambient.g:=0.5;
      raumschiff.g_pMeshMaterials[_i].ambient.b:=1;
      raumschiff.g_pMeshMaterials[_i].diffuse.r:=0.5;
      raumschiff.g_pMeshMaterials[_i].diffuse.g:=0.5;
      raumschiff.g_pMeshMaterials[_i].diffuse.b:=1;
    end;    
    raumschiff.g_pMeshTextures[_i]:= NIL;
    if (_d3dxMaterials^.pTextureFilename = NIL) or
       (failed(D3DXCreateTextureFromFile(xenScreen.Device,
               _d3dxMaterials^.pTextureFilename,
               raumschiff.g_pMeshTextures[_i])))
      then raumschiff.g_pMeshTextures[_i] := NIL;
    inc(_d3dxMaterials);
  end;
  _pD3DXMtrlBuffer := NIL;
end;



So setze ich bei der Kamera ein kleines Licht für die Effekte:

Code:

with camlight do
  begin
    ZeroMemory(@camlight,sizeof(camlight));
    _Type := D3DLIGHT_directional;
    //_Type := D3DLIGHT_spot;
    Diffuse.r := 0.5;
    Diffuse.g := 0.5;
    Diffuse.b := 0.5;
    Ambient.r:=0.3;
    Ambient.g:=0.3;
    Ambient.b:=0.3;
    Specular.r:=0.6;
    Specular.g:=0.6;
    Specular.b:=0.6;
    D3DXVec3Normalize(Direction, D3DXVector3(ncurrcamx2,ncurrcamy2,ncurrcamz2));
    camlight.Position:=D3DXVector3(ncurrcamx1,ncurrcamy1,ncurrcamz1);
    camlight.Direction:=D3DXVector3(ncurrcamx2,ncurrcamy2,ncurrcamz2);
    Falloff:=1;
    Range:=100;
    attenuation0:=0.3;
    attenuation1:=0.3;
    attenuation2:=0.3;
    xenscreen.Device.SetLight(1, camlight);
    xenscreen.Device.LightEnable(1, true);
    xenscreen.Device.SetRenderState(D3DRS_LIGHTING, dword(true));



Wie kriege ich Metall auf meinem Raumschiff hin? Oder geht das nur mit einer Textur?

4

Ich will meine Objekte unterschiedlich groß haben, und habe das mit MatrixScaling gemacht. Bei der Sonne, die auf 0/0/0 steht, klappt das prima, alle anderen Objekte sind einfach weg. Liegt das daran, dass dann die Koordinaten und nicht nur die Größe geändert werden? Ich will die Koordinaten behalten, und nur die Größe ändern. Hier mein Code, habe etwas rumprobiert (wenn i=0 dann Sonne, die wird momentan als einziges skaliert, aber die anderen sollen auch...)

Code:

      D3DXMatrixTranslation(planet3d[i].matxyz,x,y,z);
      //D3DXMatrixTranslation(planet3d[i].matxyz,x*planettyp[i].nradius/5000,y*planettyp[i].nradius/5000,z*planettyp[i].nradius/5000);
      //D3DXMatrixMultiply(matTmp, planet3d[i].matrot, planet3d[i].matxyz);
      if i=1 then D3DXMatrixScaling(planet3d[i].matxyz,planettyp[i].nradius/5000,planettyp[i].nradius/5000,planettyp[i].nradius/5000); //größer skalieren
      //D3DXMatrixScaling(planet3d[i].matxyz,planettyp[i].nradius/5000,planettyp[i].nradius/5000,planettyp[i].nradius/5000); //größer skalieren
      D3DXMatrixMultiply(matTmp, planet3d[i].matrot, planet3d[i].matxyz);
      xenscreen.Device.SetTransform(D3DTS_WORLD,mattmp);



Geht das auch ohne MatrixScaling? Wie kann ich die Koordinaten halten?

Das war erstmal alles, puh. Ich hoffe, der Post war nicht zu lang, und freue mich auf Eure Antworten, danke sehr!

Firle

Offline

 

#2 31.01.2005 12:46:04

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

Re: Eine Handvoll AnfängerFragen

1. Ich habe bei meinen Anfängen auch in dieser Hinsicht falsch gedacht.
Du brauchst nicht mehrere Objekte, wenn du mehr sehen willst. Du muss nur das eine Objekt (Kugel) mehrmals an den verschiedenen Positionen pro frame rendern.
Also Device.SetTransform( D3DTS_WORLD, matTranslation) mit deiner verschobenen MAtrix aufrufen, dann mesh.Drawsubset(0) ... danach MAtrix verschieben und gleiches Objekt wieder rendern mesh.DrawSubset(0) ...
Du brauchst also nur eine Kugel.

2. Dafür würde ich erstmal ein kleines Partikelsystem vorschlagen - ist einfacher. Also einfach ein paar Strahlen (Dreiecke) mit Alphablending aus den Tor rauszeigen lassen.

3. Specular-Lighting macht eigentlich schon einen guten GlanzEffekt. Du musst natürlich Normalen haben, Licht + Specular via RenderState (D3DRS_SPECULARENABLE; D3DRS_LIGHTING) angeschalten haben.
Wenn nicht würde ich für den Anfang eine simple EnvironmentMap empfehlen. Könnte dir evtl. zu ein winziges uralten Sample schicken.

4. dazu musst du nur folgendes mit deiner fertigen WorldMatrix deines Objektes machen - also ohne D3DXMatrixScaling:
matWorld._00 := matWorld._00 * scale;
matWorld._11 := matWorld._11 * scale;
matWorld._22 := matWorld._22 * scale;

fertig ...
ich hoffe steht nicht zu viel Müll drinne -> mein Kopf qualmt grad noch und Finger sind etwas taub  wink


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

Offline

 

#3 31.01.2005 13:19:40

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

Re: Eine Handvoll AnfängerFragen

Hi artzuk,

Danke für die Tips. hoffentlich kriege ich das alles auf die Reihe.

1. Also die nicht 31 mal die X-Kugel mit Texturen laden, sondern die Texturen alleine laden, eine Kugel laden und die dann 31 mal zeigen mit der jeweiligen Textur. Probier ich mal.

2. Muss mal gucken, ob ich das hinkrieg irgendwie.

3. Normalen habe ich, das ist ja auch hübsches Plastik jetzt. Vielleicht habe ich vergessen, SpecularEnable einzuschalten, mal gucken. Das Sample für Environment täte mich interessieren  big_smile

4. Mal gucken, hoffentlich funzt das auch mit DX8.

Vielen Dank für die Tips, ich probiere das mal alles aus. :thx:

Firle

Offline

 

#4 31.01.2005 13:23:10

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

Re: Eine Handvoll AnfängerFragen

zu 4.:
Beim multiplzieren der Matrizen kommt es auf die Reihenfolge an

D3DXMatrixMultiply(Result, matA, matB);

MatrixA wird zuerst "ausgeführt", erst dannach MatrixB. Wenn also A eine Rotation und B eine Verschiebung  (Tramslation)  ist, wird das Objekt zuerst gedreht und dann anschließend verschoben.

D3DXMatrixMultiply(Result, matB, matA);

Hier wäre es genau anderes herum, das Objekt würde zuerst verschoben, und dann gedreht (Drehpunkt ist immer (0,0,0) )

Coolcat


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

Offline

 

#5 31.01.2005 13:31:00

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

Re: Eine Handvoll AnfängerFragen

nochmal zur 4 und DIrectX 8

@Artzuk: Das is Müll! big_smile

Es müssen wenn überhaupt alle Achsen komplett skaliert werden!
Dein Code fuktioniert nur mit einer nicht rotierten Matrix.

Code:

//DirectX 9:
matWorld._00 := matWorld._00 * scale;
matWorld._01 := matWorld._01 * scale;
matWorld._02 := matWorld._02 * scale;
matWorld._10 := matWorld._10 * scale;
matWorld._11 := matWorld._11 * scale;
matWorld._12 := matWorld._12 * scale;
matWorld._20 := matWorld._20 * scale;
matWorld._21 := matWorld._21 * scale;
matWorld._22 := matWorld._22 * scale;

// DirectX 8 (einfach alle Koords +1)
matWorld._11 := matWorld._11 * scale;
matWorld._12 := matWorld._12 * scale;
matWorld._13 := matWorld._13 * scale;
matWorld._21 := matWorld._21 * scale;
matWorld._22 := matWorld._22 * scale;
matWorld._23 := matWorld._23 * scale;
matWorld._31 := matWorld._31 * scale;
matWorld._32 := matWorld._32 * scale;
matWorld._33 := matWorld._33 * scale;




Coolcat


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

Offline

 

#6 31.01.2005 13:35:34

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

Re: Eine Handvoll AnfängerFragen

@Coolcat: achso - boah ... in mir hängen 'n Haufen falsche Informationen ... da bin ich schon Mathe-Leistungskurz und wir lernen dennoch nur oberflächlichen Müll ... ney ney ney
Danke für die Korrektur  8)


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

Offline

 

#7 31.01.2005 13:45:05

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

Re: Eine Handvoll AnfängerFragen

ich hatte überhaupt keine Matrizen in der Schule....und ich hatte auch MatheLK

Allerdings lernt man in einem halben Jahr an der Uni wesentlich mehr als in drei Jahren ABI.... lol

Coolcat


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

Offline

 

#8 31.01.2005 13:50:55

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

Re: Eine Handvoll AnfängerFragen

Hmm. Sieht jetzt noch komplizierter aus. Ich probier das mal aus, nochmals danke für die Tips!  :thx:

Firle

Offline

 

#9 31.01.2005 14:14:14

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

Re: Eine Handvoll AnfängerFragen

Eine Matrix is in DirectX so aufgebaut (ich hoffe das is so richtigrum):

Code:

x-Achse.X |  y-Achse.X | z-Achse.X | Trans.X
x-Achse.Y |  y-Achse.Y | z-Achse.Y | Trans.Y
x-Achse.Z |  y-Achse.Z | z-Achse.Z | Trans.Z
x-Achse.W |  y-Achse.W | z-Achse.W | Trans.W



Es gibt also die drei Vektoren für die Ausrichtung im Raum (x,y,z-Achse) und die Position.
Ich habe oben einfach nur die drei Ausrichtungsvektoren skaliert.

Einheitsmatrix:

Code:

 1 | 0 | 0 | 0
 0 | 1 | 0 | 0
 0 | 0 | 1 | 0
 0 | 0 | 0 | 1



Coolcat


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

Offline

 

#10 31.01.2005 17:14:43

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

Re: Eine Handvoll AnfängerFragen

Ich bin mir da nicht so sicher ...
also ich dachte eigentlich immer, dass die Position bei DX in der letzten Zeile steht.
Der Rest stimmt - hab ich auch so big_smile


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

Offline

 

#11 31.01.2005 18:07:00

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

Re: Eine Handvoll AnfängerFragen

jep hab gerade nachgeguckt:
ich hab vertikal/horizonal vertauscht....

matWorld._01
wäre z.B. Zeile 0 und Spalte 1 (zeilen immer zuerst)

Also so:

Code:

 x-Achse.X | x-Achse.Y | x-Achse.Z | x-Achse.W
 y-Achse.X | y-Achse.Y | y-Achse.Z | y-Achse.W
 z-Achse.X | z-Achse.Y | z-Achse.Z | z-Achse.W
 trans.X   | trans.Y   | trans.Z   | trans.W


Coolcat


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

Offline

 

#12 31.01.2005 19:33:39

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

Re: Eine Handvoll AnfängerFragen

Bist dir da ganz sicher?
Ich dachte, dass vRight, vUp und vLook (also x-,y-,z-Achse) vertikal angeordnet seien - zumindes bei einer ViewMatrix?


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

Offline

 

#13 01.02.2005 07:20:14

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

Re: Eine Handvoll AnfängerFragen

äh, von einer ViewMatrix hab ich keine Ahnung, aber eigentlich düfte das nicht wesentllich anders sein


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

Offline

 

#14 01.02.2005 08:25:15

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

Re: Eine Handvoll AnfängerFragen

Hi!

Also ich hatte gestern leider nicht mehr viel Zeit, aber ich habe mal angefangen, die Objekte so umzubauen, dass ich nur noch 1 Mesh und Materials pro Planet und Asteroid habe, das scheint gut zu klappen, jetzt sind meine Wolken wieder weg aber ich vermute mal einen Fehler beim Laden.

Das mit der Skalierung muss ich noch ausprobieren, das wird ja immer verwirrender :?

Danke für die Hinweise,
Firle

Offline

 

#15 01.02.2005 12:51:47

The Spellmaker
Member
Registriert: 24.01.2005
Beiträge: 10
Web-Seite

Re: Eine Handvoll AnfängerFragen

Der Vollständigkeit halber noch die Viewmatrix

Code:

u = Up Vektor (Gibt an, wo in unserer Welt oben ist)
r = Right Vektor (u x d = Rechtsvektor)
d = Rechtungsvektor (wohin schauen wir?)
p = Positionsvektor (wo stehen wir?)

 r.x |  u.x |  d.x |  0
 r.y |  u.y |  d.y |  0 
 r.z |  u.z |  d.z |  0
-r*p | -u*p | -d*p |  1



In den ersten drei Kästchen der ersten drei Spalten stehen Rechts-, Up- und Richtungsvektor. Die 4. Einträge dieser Spalten bestehen aus dem negativen Punktprodukt aus dem jeweiligen Vektor und dem Positionsvektor.

Alle Angaben natürlich ohne Gewähr.

@Coolcat: welchen Prof habt ihr? Wiegner?  big_smile


I want to know god's thoughts - the rest are details - www.spellsoft.de

Offline

 

#16 01.02.2005 12:58:22

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

Re: Eine Handvoll AnfängerFragen

@Spellmaker:
äh, in Lineare Algebra hab ich den Plesken (Zitat: "Beweis: Klar!", "Beweis: Übung!"), wobei ich inzwischen LA auf nächstes Jahr geschoben hab, der Prof. is einfach unmöglich...
in Analysis hab ich den Stens, der is nich schlecht...

Coolcat


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

Offline

 

#17 01.02.2005 13:03:07

The Spellmaker
Member
Registriert: 24.01.2005
Beiträge: 10
Web-Seite

Re: Eine Handvoll AnfängerFragen

Zitat:

aus $%^°/&$"§ folgt logisch: Pi = 3

Dafür sind die Übungen aber gut. Ich peile für LA mal ganz bescheiden eine 4 im zweiten Versuch an.  big_smile


I want to know god's thoughts - the rest are details - www.spellsoft.de

Offline

 

#18 01.02.2005 13:22:48

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

Re: Eine Handvoll AnfängerFragen

@Spellmaker: Ist die normale WorldMatrix genauso aufgebaut? (auser das mit den Punktprodukten)
Woran kann das liegen, dass die Cam sich erst dann richtig bewegt, wenn man nicht das negative Punktprodukt nimmt? LH bzw. RH?


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

Offline

 

#19 01.02.2005 13:36:50

The Spellmaker
Member
Registriert: 24.01.2005
Beiträge: 10
Web-Seite

Re: Eine Handvoll AnfängerFragen

Nein, die Worldmatrix ist nicht so aufgebaut. Die Worldmatrix ist eine "Komposition" aus einer oder mehreren dieser Matrizen: Transformationsmatrix, Rotationsmatrix, Skalarmatrix.

Deine zweite Frage verstehe nicht  :?


I want to know god's thoughts - the rest are details - www.spellsoft.de

Offline

 

#20 01.02.2005 13:46:50

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

Re: Eine Handvoll AnfängerFragen

Hat bei unserer Kamera die Matrix (viewMatrix) per Hand geschrieben ... beim DotProduct in der letzten Zeile musste ich das negativieren weg lassen, damit sich die Cam richtig bewegt.

In einer WorldMatrix gibt es doch bestimmt auch sowas wie vRight, vUp und vLook? oder?


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

Offline

 

#21 01.02.2005 13:58:18

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

Re: Eine Handvoll AnfängerFragen

Zitat:

In einer WorldMatrix gibt es doch bestimmt auch sowas wie vRight, vUp und vLook? oder?

Das meinte ich mit X,Y,Z-Achse...

Coolcat


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

Offline

 

#22 01.02.2005 13:59:39

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

Re: Eine Handvoll AnfängerFragen

Oh mein Gott!
Ich lass das mit dem skalieren wohl erstmal sein, ihr habt mich völlig geschafft.  :?  Allein der Versuch, dem Thread zu folgen... :rock:

Aber danke für die Tips, ich werde die anderen Sachen erstmal testen  :mrgreen:

Firle

Offline

 

#23 01.02.2005 14:20:50

Holly
Member
Ort: Leipzig
Registriert: 24.01.2005
Beiträge: 76
Web-Seite

Re: Eine Handvoll AnfängerFragen

dieses hochtrabende gequatsche  big_smile kannst du erstmal ignorieren.....das versteh ich nicht mal richtig.

was du wissen musst: ein objekt besitzt eine worldmatrix. diese kann aus mehreren matrizen zusammengesetzt werden. da gibt es einmal die translations-matrix zum positionieren von objekten. dann gibts die rotationsmatrix zum rotieren und die skalierungs-matrix zum skalieren von objekten.

nehmen wir mal an du willst dein objekt um die eigene y-achse drehen lassen und dann noch nach rechts verschieben. dann brauchst du erstmal ne Y-rotations-matrix, die du mit werten füllst (D3DXMatrixRotationY). nun brauchst du noch eine translations-matrix (D3DXMatrixTransform oder wars D3DXMatrixTranslation *narf*)......diese beiden matrizen musst du miteinander multiplizieren. wenn du bei D3DXMatrixMultiply zuerst die translations-matrix angibts, dann wird das objekt nun zuerst verschoben und dann erst gedreht. das wäre falsch und sieht dann so aus, als wenn die erde um die sonne kreist.
wenn du zuerst die rotations-matrix angibst, dann wird das objekt zuerst gedreht und dann verschoben. da bleibt dann das objekt an der stelle (wohin du es verschoben hast) stehen und dreht sich einfach......total easy oder?  :mrgreen:

mit einer skalierungsmatrix is das dann genauso.....nur, dass die dein objekt halt vergrößert bzw. verkleinert.

HOLLY


Enjoy the 3 dimensions of livin'....

Offline

 

#24 01.02.2005 14:36:19

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

Re: Eine Handvoll AnfängerFragen

Hi Holly,

soweit verstanden, danke. Da das mit dem Bewegen und dem Rotieren ja schon 1a funktioniert, muss ich mir nur eine Skalierungsmatrix machen, und die dann vor der Darstellung einfach mit dem Ergebnis von Rotation und Positionierung multiplizieren?

Gruß
firle

Offline

 

#25 01.02.2005 15:25:22

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

Re: Eine Handvoll AnfängerFragen

@Coolcat: Jo - hat ich verstanden mit den Achsen.
Wollte blos wissen, da ja bei einer ViewMatrix diese Vektoren spaltenweise angeordnet sind, ob die nun wirklich zeilenweise in einer WorldMatrix liegen smile


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

Offline

 

Brett Fußzeile

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson