![]() |
|
||||||||||
|
|||||
|
Колдовство с мешем и подбор подходящих текстур на SkyBox позволили добиться хороших результатов с цилиндрической ногой:
К сожалению, она до сих пор не хочет отражаться в нижней плоской ноге. Игра с reflectionTexture.position не приводит к появлению отражения. Asfel, не могли бы вы рассказать подробней про Цитата:
|
|
|||||
|
Про рендер ножки на текстуру:
Я имел ввиду взять и отрендерить ее на текстуру отдельно от сцены, а получившуюся текстуру использовать в PlanerReflectionMethod. Хотя тут посути ножка и так должна была бы быть видна раз видно стол с низу, хотя может она просто не попадает в отражение, но раз вы говорите что изменение позиции центра отражения ничего не дали то видимо нет... Про куб для ножки. Это я имел ввиду взять куб, на его стороны отрендерить сцену самостоятельно либо просто взять текстуры скайбокса, куб сделать маленького размера и расположить вокруг ножки. Затем отрендерить на ножку окружение т.е куб и в таком случае отражение сцены было бы как бы более стянутым, но вы этого эффекта и так добились .Кстати то что с ножкой, чтобы именно вот так только 1 объект было не видно с таким я не сталкивался, но могу посоветовать попробовать материал отобразить на спрайте или плейне(от поднокжи) чтобы посмотреть рендерится ли ножка вообще на нем |
|
|||||
|
Мне удалось добиться отражения цилиндрической ножки в нижней плоской ноге:
Здесь я использовал PlaneGeometry в сочетании с PlanarReflectionTexture, пример чего можно посмотреть в первом посте (там где R2D2 перед зеркалом ездит). И это мило и замечательно ![]() Проблема только в том, что я не нашел как применить эту текстуру на круг, также как она применяется к плоскости. В исходниках я не нашел какого-нибудь CircleGeometry или чего-то подобного. Натягивание PlanarReflectionTexture на CylinderGeometry, к сожалению, не приносит желаемого результата. Я попробовал добраться до vertexData плоскости, думал "Щас я как добавлю туда точек, и всего-то делов". Но не тут-то было. Результат такой: То есть он просто игнорирует точки дальше четвертой: mesh.subMeshes[0].vertexData = -50,-50,0,0,0,-1,1,0,0,0,1,0,0 | 50,-50,0,0,0,-1,1,0,0,1,1,0,0 | -50,50,0,0,0,-1,1,0,0,0,0,0,0 | 50,50,0,0,0,-1,1,0,0,1,0,0,0 mesh.subMeshes[0].numVertices = 4 // После добавления точки (методом splice) mesh.subMeshes[0].vertexData = -50,-50,0,0,0,-1,1,0,0,0,1,0,0 | 50,-50,0,0,0,-1,1,0,0,1,1,0,0 | -50,50,0,0,0,-1,1,0,0,0,0,0,0 | 0,100,0,0,0,-1,1,0,0,0,0,0,0 | 50,50,0,0,0,-1,1,0,0,1,0,0,0 mesh.subMeshes[0].numVertices = 4 |
|
|||||
|
Нашел в исходниках объяснение значений в векторе vertexData:
/**
* Updates the vertex data. All vertex properties are contained in a single Vector, and the order is as follows:
* 0 - 2: vertex position X, Y, Z
* 3 - 5: normal X, Y, Z
* 6 - 8: tangent X, Y, Z
* 9 - 10: U V
* 11 - 12: Secondary U V
*/
public function updateData(data : Vector.<Number>) : void
{
...
}
|
|
|||||
|
Ура, свершилось! Идея с добавлением вершин осталась старая. Просто я нашел таки способ их добавить. Он, конечно же, оказался прост и очевиден. Нужно было создавать PlaneGeometry с большим количеством сегментов. На эту мысль меня натолкнул пример здесь, там где идет описание примитива Plane. На демке с этой страницы можно видеть как строится примитив из треугольников.
Следующей задачей было выяснить как эти точки группируются в векторе vertexData. Группируются так (пример квадрата 50x50 с segV = 2 и segH = 2): Для большего количества сегментов группировка точек будет аналогична. Получается чтобы превратить квадратную плоскость в правильный многоугольник нужно сдвинуть крайние точки квадрата на красную окружность. Чем и занимается следующая функция: /** * Функция меняет значения x, y, z в векторе v для крайних точек * плоскости. Предусловием является то, что созданная PlaneGeometry * должна быть вписана в круг радиуса r. Также количество сегментов * по вертикали должно совпадать с количеством сегментов по горизонтали. * @param v * @param r */ private function convertPlaneToCircle( v:Vector.<Number>, r:Number ):void { // Выясняем количество сегментов. var segCount:int = Math.sqrt(v.length / 13) - 1; // Изобразим картинку для segCount = 3 // 12 13 14 15 // o----o----o----o // | | | | // 8 o----o----o----o 11 // | | | | // 4 o----o----o----o 7 // | | | | // o----o----o----o // 0 1 2 3 // То есть нужно изменить положение точек с обозначенными // индексами. Помним, что по предусловию точки 0, 3, 12 и 15 // (для данного случая) лежат на окружности радиуса r. // Остальным точкам нужно задать координаты таким образом, чтобы // они стали вершинами правильного многоугольника. // Сразу можно выяснить шаг угла. var angleStep:Number = (90.0 / segCount) / DEG_IN_RAD; var angle:Number = 0; var pointsCount:int = v.length / 13; for (var n:int = 0; n < pointsCount; ++n) { // Нас интересуют точки нижнего ряда if (n > 0 && n < segCount) { // Здесь начинается с угловой координаты -3 * pi / 4 // и идет в сторону увеличения angle = ( -3 * Math.PI / 4) + n * angleStep; // Ставим x v[ n * 13 ] = Math.cos(angle) * r; // Ставим y v[ n * 13 + 1 ] = Math.sin(angle) * r; } // Еще нас интересуют точки верхнего ряда else if (n > (segCount * (segCount + 1)) && n < pointsCount - 1) { // Здесь начинается с угловой координаты 3 * pi / 4 // и идет в сторону уменьшения angle = ( 3 * Math.PI / 4) - n * angleStep; v[ n * 13 ] = Math.cos(angle) * r; v[ n * 13 + 1 ] = Math.sin(angle) * r; } // Еще нас интересует левая сторона else if ((n % (segCount + 1)) == 0 && n > 0 && n < (segCount * (segCount + 1))) { // Здесь начинается с угловой координаты -3 * pi / 4 // и идет в сторону уменьшения angle = ( -3 * Math.PI / 4) - int(n / (segCount + 1)) * angleStep; v[ n * 13 ] = Math.cos(angle) * r; v[ n * 13 + 1 ] = Math.sin(angle) * r; } // Еще нас интересует правая сторона else if ((n % (segCount + 1)) == segCount && n > segCount && n < pointsCount - 1) { // Здесь начинается с угловой координаты -pi / 4 // и идет в сторону увеличения angle = ( -Math.PI / 4) + int(n / (segCount + 1)) * angleStep; v[ n * 13 ] = Math.cos(angle) * r; v[ n * 13 + 1 ] = Math.sin(angle) * r; } } } Так вот, в общем мы просто меняем координаты точек и радуемся результату: Еще раз спасибо товарищам Asfel и vorodis2 ![]() |
![]() |
![]() |
Часовой пояс GMT +4, время: 11:02. |
|
|
« Предыдущая тема | Следующая тема » |
|
|