Для фактической математики коробления, это может получить очень сложно, почему бы вам не начать здесь? ,
Теперь я буду говорить о том, как вы можете применить это, предполагая, что у вас уже есть математик, как вы будете делать ваши деформации вниз.
2 способа:
1) Каждый кадр, посетить каждую вершину в модели цилиндра и смещение его в некотором роде.
2) Смещение вершин в вершинном шейдере , как вы рендеринг. OpenGL ES 2.0 поддерживает вершинные шейдеры. Таким образом , вы находитесь в удаче, в некотором смысле.
Вы хотите только деформировать объект , как он появляется на экране , или вы хотите , чтобы деформировать объект так что каждый объект в игре знает , что она была деформирована?
Если вы деформировать объект в вершинном шейдере, то , что происходит непосредственно перед дисплеем / растеризации , так что это значит ни один из объектов игр не будет знать о деформации . Это нормально , если вы просто сделать заставку, или если деформации настолько малы , что они не оказывают никакого влияния на collidable формы объекта.
Когда вы деформировать геометрию в вершинных шейдеров исходных вершин модели на самом деле не двигаться , (они только кажутся движущимися ).
Деформация в вершинный шейдер
недеформированной:
Деформированные
Это из главы 6 руководства по cg (программа № 14).
Код шейдера, чтобы произвести эту деформацию что-то вроде
// choose a displacement amount
float displacement = scaleFactor * 0.5 * sin(position.y * frequency * time) + 1 ;
// displace it in the direction of the normal
float4 displacementDirection = float4(normal.x, normal.y, normal.z, 0) ;
// move the vertex
float4 newPosition = position + displacement * displacementDirection ;
// transform (as normal)
oPosition = mul(modelViewProj, newPosition) ;
Таким образом, вы можете видеть, это происходит перед тем дисплей (вершинные шейдеры происходят на GPU), поэтому код процессора практически не способ доступа преобразованного положение вершины (есть способы передачи данных с GPU на CPU (в основном через текстуры), но мы не туда).