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(); m_TempChunk := TChunk.Create(); 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 = 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
Narses: Code- durch Delphi-Tags ersetzt
jaenicke - Mo 26.07.10 21:25
kompas hat folgendes geschrieben : |
| 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; interface
uses Types, Classes, SysUtils, AsphyreDef, AsphyreMath, AsphyrePrimitives; |
Moderiert von
Narses: 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:
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
Jakob_Ullmann hat folgendes geschrieben : |
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
guinnes hat folgendes geschrieben : |
| 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) |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!