Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - von c++ umwandlung zu Delphi..


kompas - Mo 26.07.10 21:00
Titel: von c++ umwandlung zu Delphi..
hallo.

also jetz habe ich meine hände in dem schmutz.
und sowie ich nur c++ quelle code gefunden habe für 3d objekt file zu speichern, also muss ich jetzt, für einfach zu machen, die c++ in delphi sprache umändern, so dass ich sie in mein converter program einfügen kann.

und so, für den moment, starte ich mit einem problem.
http://www.jmdoudoux.fr/divers/syntheses%20langages.htm

hier zum beispiel, dies werdet mir schon hilflich sein, aber leider, hier gebe es nur c# programmation, und nicht c++.

also kann jemanden mir helfen bei diese umänderung arbeit.

Beispiel:

Quelltext
1:
2:
3:
4:
5:
# CLoad3DS::CLoad3DS()
# {
# m_CurrentChunk = new tChunk; // Initialize and allocate our current chunk
# m_TempChunk = new tChunk; // Initialize and allocate a temporary chunk
# }

CLOAD3DS
This constructor initializes the tChunk data

also tChunk funktion da kenne ich mich nicht richtig aus, und so in delphi, wie könnte dies interpretiert werden?
danke!


jaenicke - Mo 26.07.10 21:16

Das kannst du praktisch 1:1 übersetzen.

Delphi-Quelltext
1:
2:
3:
4:
5:
constructor TCLoad3DS.Create();
begin
  m_CurrentChunk := TChunk.Create(); // Initialize and allocate our current chunk
  m_TempChunk := TChunk.Create(); // Initialize and allocate a temporary chunk
end;


kompas - Mo 26.07.10 21:22

danke, aber hier habe ich noch etwass anderst gefunden!

schaue mal, ob dies nicht das selbe wehre?

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
type

  T3DModel = class;

// TChunk only used for loading the 3ds file. This class is destroyed after
// loading
  TChunk = class(TObject)
  private
    FId:Word;
    FLength:Integer;
    FBytesReaded:Integer;
    FModel:T3DModel;
    FFileHandle:Integer;
    function GetBytesRemaining: Integer;
  public
    constructor Create(Model:T3DModel);
    destructor Destroy;override;
    function Read:Integer;
    function ReadBuffer(var Buffer; Count:Integer):Integer;
    function ReadRemainingBuffer(var Buffer):Integer;
    procedure ProcessNextChunk(PreviousChunk:TChunk);
    procedure NexFilePosition;
    function ReadObjectString:string;
    function WaitForLength:Boolean;
    procedure UpdateByteCounter(Value:Integer);
    property Id:Word read FId;
    property Length:Integer read FLength;
    property BytesReaded:Integer read FBytesReaded;
    property BytesRemaining:Integer read GetBytesRemaining;
    property FileHandle:Integer read FFileHandle write FFileHandle;
end;


also muss dies alles zugeordnet werden, für die zwei kleine linien wie in c++ geschrieben wurden?

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt


jaenicke - Mo 26.07.10 21:25

user profile iconkompas hat folgendes geschrieben Zum zitierten Posting springen:
schaue mal, ob dies nicht das selbe wehre?
Das ist ja ein anderer Teil des Codes. Letztlich lässt sich das meiste fast direkt übersetzen. Nur bei sprachspezifischen Befehlen muss man halt etwas Hand anlegen.


kompas - Mo 26.07.10 21:29

ja ok, danke janicke, also werde ich mal gut bemerken wenn so ein kode bei dem c++ sprache Vorkommt.


Xion - Mo 26.07.10 21:43

Ich weiß nicht ob du das richtig verstanden hast. Der erste Code ist eine procedure (constructor) in C++. Der Contructor dient zur Erstellung der Klasse.

Der zweite Code ist eine Klassendefinition in Delphi. Also...eine Liste an proceduren, aber ohne Implementierung erstmal. Der Constructor ist auch darunter. Die "property"-Zeilen kannst du meines Wissens so nicht in C++ umsetzen. In C++ sind dies Getter und Setter Methoden üblicherweise. Die Getter und Setter kannst du aber umgekehrt in Delphi auch verwenden.


kompas - Mo 26.07.10 23:03



jaenicke - Di 27.07.10 05:21

Das gehört schon alles in die Unit rein.

Anders als bei C++ mit der Unterteilung in Code und Header wird das in Delphi alles in eine Datei geschrieben.


kompas - Di 27.07.10 11:10

ok danke jaenicke!

eine weitere frage.

hier bei der c++ programmation, wurde
# #include <math.h>
benutzt.
also ist dieser math.h file gleichwert mit dem Math.pas file?

denn hier handelt es sich um mathematic funktionen.

oder gebe es bei delphi mehere files?


Jakob_Ullmann - Di 27.07.10 11:22

K. A. aber ich glaube nicht, dass das gleichwertig ist. Wäre großer Zufall. Also bei den Funktionen musst du probieren, wie das Analogon heißt. Ansonsten hast du mit System und Math in Delphi die mathematischen Funktionen (System z. B. für sin() und cos(), Math den anderen Mist, afaik auch tan().) Hab aber gerade kein Delphi, mit dem ich das ausprobieren könnte.


kompas - Di 27.07.10 11:37

hallo jakob_ulmann.

aber ich habe dies als Vergleich benutzt.

http://www.jwrider.com/lab/MATH_PAS.htm (also dies ist für die mathematic funktionen bei delphi)
und dieser weitere link, für die mathematic funktionen wie der math.h file unterstürtzt.
http://en.wikipedia.org/wiki/Math.h

jetzt bin ich einverstanden, dass entweder math.h oder math.pas file, noch weitere mathematic funktionen unterstürtz.....

denn hier zum beispiel, sowie mein program wie ich diese funktion will einfüge, für 3d model convertion.

also hier als weitere beispiel, wurde bei einem file dies benutzt.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
unit AsphyreMeshes;
//---------------------------------------------------------------------------
// AsphyreMeshes.pas                                    Modified: 11-Oct-2005
// Mesh Storage implementation                                    Version 1.0
//---------------------------------------------------------------------------
// The contents of this file are subject to the Mozilla Public License
// Version 1.1 (the "License"); you may not use this file except in
// compliance with the License. You may obtain a copy of the License at
// http://www.mozilla.org/MPL/
//
// Software distributed under the License is distributed on an "AS IS"
// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
// License for the specific language governing rights and limitations
// under the License.
//---------------------------------------------------------------------------
interface

//---------------------------------------------------------------------------
uses
 Types, Classes, SysUtils, AsphyreDef, AsphyreMath, AsphyrePrimitives;


Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt


Jakob_Ullmann - Di 27.07.10 11:56

Da hast du's: math.h definiert cos(). In Delphi ist Cos() in der Unit System definiert. Also musst du System und Math einbinden, um ein etwas Gleichwertiges für dein math.h zu erhalten:


C#-Quelltext
1:
#include <math.h>                    


wird zu


Delphi-Quelltext
1:
uses ..., Math, System, ...;                    


(und bei 3D-Sachen ist die Gefahr ja ziemlich groß, auf trigonometrische Funktionen zu stoßen. :wink: )


guinnes - Di 27.07.10 12:06

user profile iconJakob_Ullmann hat folgendes geschrieben Zum zitierten Posting springen:

wird zu


Delphi-Quelltext
1:
uses ..., Math, System, ...;                    
Eher nicht. System ist automatisch in den Uses drin ( nicht sichtbar )


Jakob_Ullmann - Di 27.07.10 12:53

user profile iconguinnes hat folgendes geschrieben Zum zitierten Posting springen:
Eher nicht. System ist automatisch in den Uses drin ( nicht sichtbar )


Richtig! Wie konnte ich das nur vergessen...


kompas - Di 27.07.10 13:36

ja danke, dies ist dann auch weiter erklärt.

Also als weitere frage.
wenn ich den 3ds.cpp code anschaue, hier habe ich keine spezielle math funktion gesehen.
Also kommt jetzt der warum das der programmer diese math.h in diesem loader einbezogen hat.

eher dass ich etwass in dem program quelle code übersehen habe.
also kann einer schnell der cpp code anschauen, und mir Verraten, ob es ein spezielle sin gebe, für das der programmer diese math.h file zu diesem file einbezogen hat.


Jakob_Ullmann - Di 27.07.10 14:39

Kommentiere doch einfach die #include-Direktive aus und schau, ob der Compiler meckert.

ABER: Ich frage mich, wo der Typ die ganzen Funktionen her nimmt, die er zur Normalenberechnung verwendet. Auf jeden Fall muss er, nach seinem Einrückstil zu urteilen, besoffen gewesen sein, als er den Kot geschrieben hat.


kompas - Di 27.07.10 18:36

warum muss er besoffen gewesen sein, wen er der kode geschrieben hatte?

Stimmt etwas nicht mit den 3d normales programierung?

denn diese Berechnung style, sind auch für die andere loader benutzt,also hier kann ich nachschauen für obj file format loader oder für ms3d für milkshape format.
also es ändernt sich ein bisschen, aber der prinzyp ist das selbe.

also hier eine kleine explikation.

Zitat:
about the averaged normal:
faces that share verticies have different normals for those verticies this creates hard edges when doing lighting etc. to acheive smoothed normals you would do this:


Quelltext
1:
2:
3:
4:
5:
6:
7:
for each vertex
  find all faces that use the vertex
    sum up normals from each face for that vertex
    divide by number of faces
    store averaged normal and remove obsolete ones
  next
next



und hier weitere info....

Zitat:
This will be:
a) slow (O(M*N))
b) wrong (unnormalized)

A simple solution would be:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
for each vertex {
   normal = zero
}
for each face {
   calculate face normal
   add face normal to all 3 vertices of face
}
for each vertex {
   noramlize normal
}


Runs in O(N+M) and gives normalized results. You could include calculation of whole TBN matrix so you don't have to do another pass. Smoothing groups have to be handeld before this step becouse you need to create duplicated vertices.

ps: If you are using modes exported from 3DS MAX be very carefull since they are often screwed up. Specialy if you used mirroring or some replication.

to add compilication to that, you can use smoothing groups to determine which faces to average against, and also crease angle support (when two normals differ by a large angle (eg. cube faces) maintain more than 1 normal for that vert)