Beim berechnen der Normalenvektoren sollte man diese immer mit dessen Nachbarn verrechnen. Irgendwo hier hab ich das schon einmal erklärt.
Aber kurz ein Beispiel wie ich das mein:
Man habe einen normalen Würfel. Normalerweise steht ein Normalenvektor immer Senkrecht auf deim Dreieck. Sprich die Normalenvektoren stehen Senkrecht von den einzelnen Seiten des Würfsl ab.
Auf einer Ecke des Würfels liegen immer 6 Vertice aufeinander. Jede dieser Vertice hat einen Normalenvektor. Man Addiere diese auf, teile das ergebnis durch 6 und zum Schluss noch einmal Normalisieren. Sicherheishalber
Nun stehen die Normalenvektoren in einem 45° Grad Winkel von jeder Seite ab.
Damit ist das ungenauigkeitsproblem teilweise gelöst. Diese Art der Berechnung der Normalenvektoren ist auch sehr Praktisch was die Lichtberechnung angeht. Es sorgt für weichere Kannten
Der hier angesprochene Ansatz ist schon der richtig. Nur noch ein Schritt bevor man den Ausfallwinkel bestimmt. Der Ball schlägt ja nicht direkt auf einem Vertex auf, sondern irgendwo auf einem Dreieck. Man hat also drei Normalenvektoren. Je näher der Ball einem Normalenvektor ist, desto mehr einfluss muss er auf den entgültigen Normalenvektor haben. Du Interpolierst dann einfach zwischen den drei Normalenvekoteren und errechnest den Durchschnittswert, dessen normalisierter Vektor ist dein gegenstück zu deinem Richtungsvektor vom Ball.
Damit ist die Ungenauigkeit in etwa ausgebügelt und es wird gleich auch eine Runde fläche simuliert