я бы не сказал что форум Away3d уж так активен, из 6 вопросов что я там задавал, мне ответили только по 2 .
По поводу демок, первое что я сделал, когда начал въезжать в away это собрал все демки которые они предоставляют , там их штук 15, но очень помогло, bav рекомендую и вам собрать, там есть еще два примера с зеркальной поверхностью.
По поводу цилиндра, попробуйте.
1.Исказить целиндер, чуть чуть, то есть все вершины перемножить на Math.rendom()*0.2+0.9.
2. Может есть смысл тоже самое попробовать с точками нанесения текстуры, хотя ХЗ.
На всякий, я так добираюсь до вершин.
где
data= new Vector.<Number>();//Массив с точками для меша с шагом 13 тоесть это меш.геометрия.vertexData
data.push(v.x, v.y, v.z, 0, 1, 0, 1, 0, 0, point.x, point.y, 0, 0);
v= позиция точки
point= положения текстуры 0-1
3. там есть , 0, 1, 0, 1, 0, 0 - я понятия не имею что это за ересть, но можете тоже ее проверить, может даст какойто результат.

Код AS3:
/**
* Твиситит все мешы по обьекту
* @param content3D
* @param twistX
* @param twistY
* @param twistZ
* @param startBool в первый раз создают клон геометриии
*/
public static function twist(content3D:ObjectContainer3D, twistX:Number, zX:Number=0, zZ:Number=0):void{
var subGeom:CompactSubGeometry;
var sah:Number = 0;
var point0:Point=new Point(zX, zZ);
var point1:Point=new Point();
var ang:Number = 0;
var dist:Number = 0;
var maxY:Number = content3D.maxY;
var mmY:Number = content3D.maxY- content3D.minY;
var pros:Number = 0;
var vTest:Vector.<Number>; //вершины субмеша
var iSub:int = 0; //счетчик субмешей
var lSub:uint = 0; //количество субмешей
var i:int
var j:int
for (i = 0; i < content3D.numChildren; i++) {
if (content3D.getChildAt(i) is Mesh) {
var mesh:Mesh = content3D.getChildAt(i) as Mesh;
lSub = mesh.subMeshes.length; //количество субмешей
if (mesh.extra == undefined) {
mesh.extra = { };
}
if (mesh.extra.arrSM == undefined||mesh.extra.arrSM == null) {
mesh.extra.arrSM = [];
}
for (iSub=0; iSub < lSub; iSub++) { //цикл по субмешам меша
if (mesh.extra.arrSM[iSub] == undefined) {
mesh.extra.arrSM[iSub] = new Vector.<Number>;
for (j = 0; j < mesh.subMeshes[iSub].vertexData.length;j++) { //цикл по субмешам меша
mesh.extra.arrSM[iSub].push(mesh.subMeshes[iSub].vertexData[j]);
}
}
vTest = new Vector.<Number>;
for (j = 0; j < mesh.subMeshes[iSub].vertexData.length;j++) { //цикл по субмешам меша
vTest.push(mesh.extra.arrSM[iSub][j]);
}
for (j = 0; j < mesh.extra.arrSM[iSub].length;j+=13) { //цикл по субмешам меша
pros =1- (maxY - mesh.extra.arrSM[iSub][j + 1]) / mmY;
point1.x = mesh.extra.arrSM[iSub][j];
point1.y = mesh.extra.arrSM[iSub][j+2];
ang = anglePoisk(point0, point1)-twistX*pros;
dist = getDistance(point0, point1);
point1 = getVector(dist, ang);
vTest[j] = point0.x+point1.x;
vTest[j+2] = point0.y+point1.y;
}
subGeom= mesh.subMeshes[iSub].subGeometry as CompactSubGeometry;
subGeom.updateData(vTest);
}
}
}
}