2017-01-31 3 views
1

Je travaille actuellement sur un système de corps mou en utilisant la physique numérique des ressorts et j'ai enfin réussi à le faire fonctionner. Mon problème est que tout est actuellement en ligne droite. Je vise à reproduire quelque chose de similaire au jeu "The floor is Jelly" et tout fonctionne sauf les coins lisses et les déformations qui sont actuellement droites et angulaires.B-Spline pour n'importe quel nombre de points de contrôle

J'ai essayé d'utiliser des équations de Bézier cubique, mais cela signifie simplement que tous les 3 nœuds ont une nouvelle courbe. Existe-t-il une équation pour les splines de Bézier qui prennent en compte un nombre de points de contrôle qui fonctionnera avec la boucle de vec2 (donc le noeud [0] est le premier et le dernier point de contrôle).

Désolé, je n'ai pas de code à montrer pour cela, mais je suis complètement perplexe et googling n'élève rien.

+0

[Eigen] (https://eigen.tuxfamily.org/dox/unsupported/group__Splines__Module.html) dispose d'une bibliothèque splines. Je l'ai utilisé une fois et c'était OK malgré officiellement non pris en charge. Mais je ne pense pas qu'il supporte les courbes fermées. – Potatoswatter

+0

peut être utile de donner http://pomax.github.io/bezierinfo/#bsplines une lecture parce que l'implémentation de b-splines n'est pas vraiment tout * cela * beaucoup de travail. Aussi https://github.com/thibauts/b-spline/blob/master/index.js est une implémentation JS très lisible qui est (presque) trivialement adoptée pour un grand nombre d'autres langages, y compris C++ –

Répondre

0

Simplement google "Bibliothèque B-spline" vous donnera beaucoup de références. Cela dit, B-spline n'est pas votre seul choix. Vous pouvez utiliser la spline cubique Hermite (qui est définie par une série de points et de dérivées) (voir link pour plus de détails). D'autre part, vous pouvez également continuer à utiliser des lignes droites dans votre système et créer une courbe interpolant les sommets de la ligne droite uniquement à des fins d'affichage. Pour créer une courbe d'interpolation à travers une série de points de données, la spline Catmull-Rom est un bon choix pour une implémentation facile. Cette approche est susceptible d'avoir une meilleure performance que d'utiliser réellement une courbe B-spline dans votre système.

+0

Catmull-Rom spline était parfait et rapide! Travaillé avec des courbes fermées avec presque aucun changement à l'équation! –

0

J'utiliserais B-splines pour ce problème car ils peuvent représenter des courbes lisses avec un nombre minimal de points de contrôle. De plus, trouver la surface lisse approximative pour un ensemble de données donné est un simple problème d'algèbre linéaire.

J'ai écrit une B-spline simple, C++ bibliothèque (comprend des courbes de Bézier aussi bien) que je me sers pour les calculs scientifiques, ici: https://github.com/feevos/bsplines

il peut accepter un nombre arbitraire de points de contrôle/multiplicités et vous donner retour à la base. Cependant, créer la courbe B-spline qui correspond à vos données est quelque chose que vous devez faire.

Une excellente implémentation de B-splines (mais pas de courbes de Bézier) existe également dans GNU GSL ( https://www.gnu.org/software/gsl/manual/html_node/Basis-Splines.html). Là encore, vous devez implémenter les points de contrôle à 2/3D pour la base donnée, et fixer les conditions aux limites pour qu'elles correspondent à vos données.

Plus d'informations sur les courbes ouvertes/fermées et B-splines ici: https://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/index.html