Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,
ich versuch grad mein Mesh um paar Vertecs zu erweitern, das es net ganz so eckig aussieht, aber ich bekomm die Koordinaten vom dem neuen Vertex net raus. Ich hab mir folgendes dazu überlegt:
Und da hab ich jetzt n Gleichungssystem mit 4 Unbekannten un da komm ich ne weiter. Is das so überhaupt der richtige Ansatz, oder muss man doch anders an die Sache ran gehen? Kann mir da jmd helfen?
Registriert: So Jun 23, 2002 12:37 Beiträge: 144
Programmiersprache: C/C++, Delphi
Hier ist eine nette Methode zur Interpolation beschrieben, die schöne Ergebnisse liefert und auch noch recht leicht zu implementieren ist(selbst schonmal gemacht).
Dort gibt es auch ein Java-Applet in dem du Stützpunkte setzen und dir anschließend die Ergebnisse verschiedener Interpolationsmethoden anschauen kannst.
Ansonsten könnten kubische Splines und Tesselation noch Schlagwörter für dich sein.
Registriert: Mi Jan 31, 2007 18:32 Beiträge: 150
Programmiersprache: Pascal
Für den Fall das du nicht auf eine Vorgefertigte interpolation zurückgreifen willst einige Anmerkungen zu deinem Ansatz :
Was mir bei deinem Ansatz auffält du hast weder direkt noch indirekt |V| angegeben von daher ist es kein wunder, dass du ein derartiges Geleichungssystem erhälts, denn deine Angaben reichen nicht aus.
Um es anders auszudrücken wo gibts du den die Information um wie viel das ganze runder sein soll.
Mölichkeiten eine derartige Angabe einzubauen wären :
|V| in Abhängigkeit von |V1V2| zu definieren den von V1V und V1V3 eingeschlossenen Winkel angeben
Ich bin mir zwar nicht sicher aber, wenn ich deinen Ansatz richtig verstehe liegen alle Vektoren die du gegeben hast bzw. errechnen willst auf einer Ebene vielleicht hilft dir das weiter.
Registriert: So Jun 23, 2002 12:37 Beiträge: 144
Programmiersprache: C/C++, Delphi
Zitat:
Was mir bei deinem Ansatz auffält du hast weder direkt noch indirekt |V| angegeben von daher ist es kein wunder, dass du ein derartiges Geleichungssystem erhälts, denn deine Angaben reichen nicht aus.
Um es anders auszudrücken wo gibts du den die Information um wie viel das ganze runder sein soll.
Im Grunde wird schon angegeben wie "rund" das ganze werden soll. Durch Einbeziehung der Normalen an den Stützstellen wird sichergestellt, dass die Kurve stetig bleibt (was ja für den "runden Effekt" wichtig ist). Alles was die Werte dazwischen betrifft wird von der Interpolation an sich festgelegt (anders gesagt: Kennst du |V| bzw. |VV3| ist die ganze bisherige Überlegung hinfällig, die neuen Punkte wären ja schon bekannt)
@Bergmann89: Dein Ansatz ist gut, sinnvoll wäre evtl. eine Parametrisierung, wenn du deine Strecken nicht nur halbieren willst.
Registriert: Di Apr 29, 2008 18:56 Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,
ich hab mich jetzt bisl an den CubicSplines orientiert un dann is mir die Lösung eingefallen. Ich stell einfach ne Funktion 3. Grades auf, mit der ich den den y Wert zwichen den 2 Punkten berechnen kann. Und dieser y-Wert ist dann die Länge des Vektors(V3-V) oder anders gesagt: V = V3 + y*N. Hier nochma die Formeln:
Code:
function glBlowupMesh(V1, V2, N1, N2: TGLVector3f): TGLNormalVec3f;
var V1V2, V2V1, B1, B2, T1, T2: TGLVector3f;
var P1, P2:array[0..1]ofSingle;
var a, b, c, m1, m2, x, y:Single;
begin
result.N[0]:=(N1[0]+N2[0])/2;
result.N[1]:=(N1[1]+N2[1])/2;
result.N[2]:=(N1[2]+N2[2])/2;
result.N:= glNormalize(result.N);
V1V2[0]:= V2[0]-V1[0];
V1V2[1]:= V2[1]-V1[1];
V1V2[2]:= V2[2]-V1[2];
V2V1[0]:= V1[0]-V2[0];
V2V1[1]:= V1[1]-V2[1];
V2V1[2]:= V1[2]-V2[2];
P1[0]:=0; P1[1]:=0;
P2[0]:= glVecLength(V1V2); P2[1]:=0;
B1 := glNormalize(glVectorProd(N1, V1V2));
B2 := glNormalize(glVectorProd(N2, V2V1));
T1 := glNormalize(glVectorProd(N1, B1));
T2 := glNormalize(glVectorProd(N2, B2));
m1 :=-tan(glVecAngle(T1, V1V2));
m2 :=tan(glVecAngle(T2, V2V1));
a :=(m1+m2)/(P2[0]*P2[0]);
b :=(-2*m1-m2)/P2[0];
c := m1;
x := P2[0]/2;
y :=(a*x*x*x + b*x*x + c*x);
result.V[0]:= V1[0]+ V1V2[0]/2+ result.N[0]*y;
result.V[1]:= V1[1]+ V1V2[1]/2+ result.N[1]*y;
result.V[2]:= V1[2]+ V1V2[2]/2+ result.N[2]*y;
Um die Parametersierung kümmer ich mich später, ich muss jetzt erstma gucken wie ich die Triangles neu berechne, die Vertecs hab ich ja jetzt...
Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.