x, y und Fläche gegeben - z gesucht

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • x, y und Fläche gegeben - z gesucht

    Hallochen!

    Zuerst einmal das, was ich erreichen möchte:
    Ich habe im 3D Modus eine Fläche gezeichnet. Ich möchte nun einen Zylinder zeichnen, der genau auf der Fläche anfängt.
    D.h unter der Fläche, die ja aufgrund der verschiedene z-Werte an den Ecken schief ist, soll sich kein bisschen vom Zylinder befinden, aber er soll direkt auf der Fläche beginnen, egal auf welcher x- bzw y-Position sich der Zylinder befindet.

    Hier ist der Code mit dem ich gedacht habe, dass es funktioniert:

    GML-Quellcode

    1. d3d_set_projection(10,60,20,x1,y1,10,0,0,1)
    2. draw_set_alpha(1)
    3. draw_set_color(c_white)
    4. //Das sollte wohl jedem klar sein...
    5. d1=point_distance(x1,y1,0,0)
    6. d2=point_distance(x1,y1,0,20)
    7. d3=point_distance(x1,y1,20,0)
    8. d4=point_distance(x1,y1,20,20)
    9. d_all=d1+d2+d3+d4
    10. //Hier sollen die Entfernungen zwischen den vier Eckpunkten und dem Punkt (x1|y1) gemessen und später zusammengerechnet werden.
    11. z1=1
    12. z2=1
    13. z3=2
    14. z4=6
    15. //Jetzt lege ich die Z-Positionen der vier Ecken fest.
    16. zz=((z1*d1)+(z2*d2)+(z3*d3)+(z4*d4))/d_all
    17. //Hier liegt das Problem - denke ich zumindest...
    18. //Ich wollte jeden Eckpunkt mit seiner Distanz zu (x1|y1) malnehmen und dann durch die Gesamtdistanz teilen.
    19. //Da müsste doch eigentlich der z-Mittelwert mit Beachtung der Entfernung herauskommen.
    20. //Der Zylinder verändert seine z-Position aber nur minimal.
    21. d3d_primitive_begin_texture(pr_trianglestrip,background_get_texture(background0))
    22. d3d_vertex_texture(0,0,z1,0,0)
    23. d3d_vertex_texture(0,20,z2,1,0)
    24. d3d_vertex_texture(20,0,z3,0,1)
    25. d3d_vertex_texture(20,20,z4,1,1)
    26. d3d_primitive_end()
    27. //Hier wird die Fläche gezeichnet.
    28. d3d_draw_cylinder(x1-1,y1-1,zz,x1+1,y1+1,128,"",0,0,0,5)
    29. draw_set_color(c_red)
    30. d3d_draw_cylinder(x1-1,y1-1,0,x1+1,y1+1,128,"",0,0,0,1)
    31. //Hier der Zylinder mit einem roten Zylinder, mit dem man die genaue Position sehen kann.
    Alles anzeigen


    Wo mache ich einen Denkfehler bzw. wie kann man das vielleicht einfacher machen?
    kostenlose Android-Spiele:
    hexavirScribble Triple

    Mr. Peperonico auf Facebook
  • Wat du da machst is auch ne Interpolation und keine Berechnung.
    Du hast n Strahl, der fängt bei (x,y,-10000) an und geht in richtung (0, 0, 1) [in vektorschreibweise].
    Jetzt schaust du nur ob dieser Strahl die Ebene trifft.
    Du stellst die die Ebenengleichung in Parameterform auf, die Geradengleichung ebenfalls, und dann nur noch Gleichsetzen. Das wäre die einfachste Möglichkeit.
    Google hilft da sehr.

  • Hier erstmal das mathematische falls es jemanden interessiert:

    Quellcode

    1. ax = x2-x1
    2. ay = y2-y1
    3. az = z2-z1
    4. bx = x3-x1
    5. by = y3-y1
    6. bz = z3-z1
    7. x1+s*ax+r*bx = xt
    8. y1+s*ay+r*by = yt
    9. x1*ay+s*ax*ay+r*bx*ay = xt*ay
    10. y1*ax+s*ay*ax+r*by*ax = yt*ax
    11. x1*ay-y1*ax+r*bx*ay-r*by*ax = xt*ay-yt*ax
    12. r*(bx*ay-by*ax) = xt*ay-yt*ax-x1*ay+y1*ax
    13. r*(bx*ay-by*ax) = ay*(xt-x1)+ax*(y1-yt)
    14. r = (ay*(xt-x1)+ax*(y1-yt))/(bx*ay-by*ax)
    15. x1+s*ax+r*bx = xt
    16. y1+s*ay+r*by = yt
    17. x1*by+s*ax*by+r*bx*by = xt*by
    18. y1*bx+s*ay*bx+r*by*bx = yt*bx
    19. x1*by+s*ax*by-y1*bx-s*ay*bx = xt*by-yt*bx
    20. s*(ax*by-ay*bx) = xt*by-yt*bx-x1*by+y1*bx
    21. s = (by*(xt-x1)+bx*(y1-yt))/(ax*by-ay*bx)
    22. z1+s*az+r*bz = zt
    Alles anzeigen


    x1,y1,z1 bis x3,y3,z3 sind die 3 Punkte der Ebene. xt,yt,zt ist der gesuchte Punkt.

    Der fertige Code sieht dann so aus:

    GML-Quellcode

    1. ax = x2-x1;
    2. ay = y2-y1;
    3. az = z2-z1;
    4. bx = x3-x1;
    5. by = y3-y1;
    6. bz = z3-z1;
    7. r = (ay*(xt-x1)+ax*(y1-yt))/(bx*ay-by*ax);
    8. s = (by*(xt-x1)+bx*(y1-yt))/(ax*by-ay*bx);
    9. z = z1+s*az+r*bz;
    Alles anzeigen


    Du entsprechenden Variablen musst du dann noch ersetzen bzw. vorher definieren.