2016-07-30 22 views
1

Ich habe versucht, diese Javascript code in eine C# (Unity3d) script konvertieren. Es ist eine Implementierung von Naive Surface Nets explained here wenn das hilft.Übersetzen von Javascript in C# Probleme

Mein übersetzt C# Skript nicht ohne Fehler/Warnungen kompilieren, aber das Ergebnis ist eine gebrochen (aber erkennbar) Mesh: C# Script in Unity3D

ich auch, dass die Eckpunkte vernünftig korrekt aussehen bemerkt haben: enter image description here

(Wenn Sie nicht bereits wissen, sind die Eingangsvoxel nur Simplex-Rauschen.)

Ich möchte wirklich, dass dies funktioniert, aber ich bin nicht gut mit Javascript versiert. Kann jemand, der beide Sprachen gut kennt, mir sagen, was ich verpasst habe? Vielen Dank.

EDIT: Here's the project.

+1

Ich würde gerne helfen, aber ich bin unsicher, wie Sie Ihr Projekt über Stack Overflow erhalten. – Jace

+0

@Jace Ich werde Dropbox es und Ihnen einen Link senden. Funktioniert das für dich? – bpmw

+0

Sicher, das wird tun – Jace

Antwort

0

Gelöst. Ich habe einfach Zeile 87 des Javascript-Codes falsch übersetzt.

Original:

for(x[2]=0; x[2]<dims[2]-1; ++x[2], n+=dims[0], buf_no ^= 1, R[2]=-R[2]) { 

Meine falsche Übersetzung:

for (pos[2] = 0; pos[2] < depth - 1; pos[2]++, bufferNumber ^= 1, R[2] = -R[2]) 

Korrigiert zu:

for (pos[2] = 0; pos[2] < depth - 1; n += width, bufferNumber ^= 1, R[2] = -R[2]) 

Im Grunde ein Tippfehler. Das tut mir leid.

0

Unity Mesh erhalten eine Dreieck-Liste.
Allerdings scheint Javascript-Code Vierecksliste zu verwenden.
Sie sollten ein Quadrat in zwei Dreiecke teilen.

if (Convert.ToBoolean(mask & 1)) 
{ 

    faces.Add(buffer[m]); 
    faces.Add(buffer[m - dv]); 
    faces.Add(buffer[m - du]); 

    faces.Add(buffer[m - dv]); 
    faces.Add(buffer[m - du - dv]); 
    faces.Add(buffer[m - du]); 
} 
else 
{ 
    faces.Add(buffer[m]); 
    faces.Add(buffer[m - du]); 
    faces.Add(buffer[m - dv]); 

    faces.Add(buffer[m - du]); 
    faces.Add(buffer[m - du - dv]); 
    faces.Add(buffer[m - dv]); 
} 

mesh.SetTriangles(faces, 0); 

und Ihre dreidimensionale Anordnung implementieren hat etwas falsch ...
original Javascript-Code mit einzelnen Array funktioniert gut.

+0

Danke für die Hilfe, aber Ich habe es schon gelöst! Ich habe nur vergessen, es hier zu posten. Es war ein sehr kleiner Übersetzungsfehler von meiner Seite. Und ja, ich weiß, dass Unity Dreiecke bevorzugt, und ich habe Ihre Lösung bereits implementiert, bevor ich überhaupt wusste, dass Sie sie hier gepostet haben. (Vorher benutzte ich 'Mesh.SetIndices() ', die es Ihnen ermöglicht, Quadrate anstelle von Dreiecken anzugeben. Nichts davon spielt jetzt jedoch eine Rolle. Diese Vernetzungsmethode hat einige grundlegende Probleme, wenn sie mit Voxeldaten in Chunks verwendet wird. Ich werde diese Methode verwerfen und eine andere Methode wie Marching Cubes oder Dual Contouring versuchen. – bpmw