tirsdag, november 20, 2007

Skelletbibliotek og krav til led, knogler med videre

En af de problemstillinger vi løbende har forhold os til er at objekter som består af afstande og punkter kan opfylde afstandskravet i en række forskellige orienteringer. Det indgår i designet af hvert eneste af vores led og hver eneste af vores knogler, som endeligt successkriterium, at afstandskravene opfyldes hvis og kun hvis ledene har præcist den form vi ønsker.

Der kan opstå problemer med tvetydigheder i forhold til dette mål - lad os forholde os til vores generelle drejeled som eksempel.
Hvis vores generelle drejeled een gang har taget en omgang for meget forbliver det i den drejede tilstand og er stadig funktionsdygtigt - på samme måde som metallåget på mange flasker kan drejes for tæt til og så "hopper" gevindet en omgang op og bliver løsere igen. 

Men vores led kan i nogen situationer, i modsætning til metallåget, være i stykker: hvis en 3d model af en underarm er bundet fast til partiklernes koordinater, er modellen nu blevet snoet en gang, og fysikmodellen siger stadig, at armen er lige så funktionsdygtig som før.

Det er imidlertid kun et problem som opstår, hvis en partikel udsættes for så stor kraft at ledet går i stykker i første omgang, i løbet af een af fysikmotorens verlet-integration iterationer. Her har vi valgt at stå af, i første omgang, for et naturligt svar vil være at lave en model som har et mindre perfidt led så constrainten bliver sværere at overtræde. Det gælder her generelt, at der skal enormt meget mere kraft til at overrumple et drejeled med 180 graders drejespan, end et led med 359 graders drejespan. Alternative svar er at sætte antallet af fysik-iterationer per sekund op, at bygge og anvende en version af drejeledet med hjælpepartikler, eller at lave et runtime tjek på at partiklerne i drejeledet ikke bliver udsat for en for stor udefrakommende resulterende kraft. Med andre ord må det, pt, være brugeren af vores systems ansvar at sikre, at han ikke ødelægger det ved at begå vold mod et led som han selv har bestemt skal være svagt.

Til gengæld kan vi garantere mere for de mere specifikke led vi laver - vores eget underarms-drejeled, for eksempel, er designet med et span på netop omkring de 180 grader.

Men vores system er altså ikke fejlfrit, hvis ikke det bliver anvendt med omtanke, og det siger vi faktisk god for. Det er et generelt bibliotek til at modellere skeletter og led med, og skulle man ønske at implementere led der kan vrides i stykker i 3d med nøje specificerede krafter må man selv udbygge biblioteket med markeringer af partikler der indgår i svage led eller lignende.
Ligeledes gælder det samme hvis man ønsker for alt i verden at undgå overvridning, fordi man har en særlig voldsom fysikmotor.

Og skulle det vise sig at det generelle bibliotek har problemer med at fungere tilfredsstillende i openengine må vi blot lave en openengine udvidelse :-)

Ingen kommentarer: