20.12.2012, 18:45. Просмотров 348. Ответов 0
В общем есть у меня физ демка, в которой выпуклые тела сталкиваются, но трения нету, поэтому даже стенка из блоков просто разваливается со временем сама, блоки начинают разъезжаться.
Собсно релизовано все это по методу интегрирования Верле, где скорость у нас равна V = Pos - OldPos
Скорость в принципе можно заменить на -k*N+OldVelocity;
где N как я понял нормализованный вектор скорости (ну еще на -1 умноженный не?)
ну и еще добавить хак типа VelNew = max(-k*N+OldVelocity, 0.0f) - что бы тело внезапно не начало двигаться в другую сторону если трение = "бесконечности"
Но как это добавить в уже существующий код я не знаю, пробовал разные вариации, вот исходный метод:
C++ |
1
2
3
4
5
6
7
8
9
10
| void Physics::UpdateVerlet() { //Обновляем положение вершин
for( int I = 0; I < VertexCount; I++ ) {
Vertex& V = *Vertices[ I ];
Vec2 OldPosition = V.Position;
V.Position += V.Position-V.OldPosition + V.Acceleration*Timestep*Timestep;
V.OldPosition = OldPosition;
}
} |
|
А вот то, что я пытался сделать:
C++ |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| void Physics::UpdateVerlet() { //Обновляем положение вершин
for( int I = 0; I < VertexCount; I++ ) {
Vertex& V = *Vertices[ I ];
Vec2 VelOld = V.Position-V.OldPosition;
V.Position += V.Position-V.OldPosition + V.Acceleration*Timestep*Timestep;
Vec2 VelOld2 = VelOld;
VelOld2.Normalize();
VelOld2=VelOld2*(-1);
if (VelOld*CollisionInfo.Normal<0.0f)
V.OldPosition=V.Position-VelOld*(VelOld2*(-0.001)+VelOld>0);
else
V.OldPosition=V.Position-VelOld;
}
} |
|
но получилось не очень, как мне доработать метод, что бы появилось трение?