![]() |
|
||||||||||
|
|||||
|
Привет, товарищи
![]() Делал ли кто-нибудь в away3d эффект хромовой поверхности? Вот я рою интернет и нахожу ссылки на любопытные примеры: http://away3d.com/comments/chrome-ball // здесь используется SkyBox http://www.closier.nl/blog/?p=46 // здесь тоже SkyBox http://away3d.com/comments/ // здесь описываются новые потрясающие свойства, доступные в Away3d 4.1 alpha В том числе на этой последней странице есть ссылка на демо, и в этом демо как раз то что нужно. Однако, исходников этой демки, как ни печально, нет. А есть только отсылка к уроку, рассказывающему про ATF текстуры. Теперь про суть проблемы. В приложении есть флешка, где реализованы мои попытки сделать хромовую ножку стола. Если нажимать пробел, то можно увидеть два варианта: 1) По-умолчанию вместо цилиндрической ножки стола выводится правильная прямоугольная призма, грани которой суть плоскости PlanarReflectionTexture (демку можно посмотреть здесь). На этой же странице приводится пример натягивания отражающей текстуры на шар, но для цилиндра это работает плохо (совсем не как хромированная поверхность). 2) Второй вариант – это использование цилиндра с текстурой отражающей SkyBox (используется метод EnvMapMethod). Совсем уже не хром. Так вот я и мучаюсь. Может ли кто-нибудь ткнуть носом в хороший урок или совет о том как сделать хромовую ножку у стола, чтобы он отражал не только SkyBox, но и нижнюю цилиндрическую ногу? UPD: у меня при попытке просмотра флешки на форуме вылезает Context3d error. При скачивании и локальном запуске все нормально. Последний раз редактировалось bav; 15.02.2013 в 23:45. |
|
|||||
|
Привет еще раз
![]() Я оказался слеп и не заметил, что эта демка с отражающей головой вполне себе мило предоставляет исходники. Достаточно было кликнуть правой кнопкой и вот они 'View source'. Однако, этот отражающий материал никак не хочет "красиво" работать на цилиндрической поверхности. На более или менее сферических поверхностях – сказка! А вот с цилиндром туго. Собственно приложу демку, в которой можно нажимать пробел и смотреть различные объекты (цилиндр, конус, сфера, капсула, тор, параллелепипед) с этим материалом, чтобы понять о чем я говорю. Есть ли у кого-нибудь мысли, как и цилиндр сделать былью? |
|
|||||
|
Регистрация: Feb 2011
Адрес: Украина Днепропетровск
Сообщений: 106
|
я бы не сказал что форум 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 - я понятия не имею что это за ересть, но можете тоже ее проверить, может даст какойто результат. /** * Твиситит все мешы по обьекту * @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); } } } } |
|
|||||
|
А какой метод отражения используется? Мне кажется тут рефракшен поможет достичь нужного эфекта.. Правда у него нельзя маску для отражения по спекуляру задавать
Кстати еще скажу что с динамическим отражением, лучше его отрендерить один раз . Все таки он довольно нагрузный. Конечно если не нужно динамику видить активно, а просто окружение. |
|
|||||
|
Asfel, используется метод FresnelEnvMapMethod. Попытка использования RefractionEnvMapMethod ни к чему хорошему не привела – начинает отражаться один только SkyBox, а нужно чтобы отражались и другие объекты.
vorodis2, спасибо на информацию. Немного поколдовав с точками меша, удалось добиться лучшего эффекта (но все же недостаточного, см. приложение). Что, по сути, произошло: я сдвинул точки, образующие боковую поверхность цилиндра, по оси Y вниз, и экспериментальным путем определил значение для еще одной магической переменной в массиве, описывающем точки. for (j = 0; j < mesh.extra.arrSM[iSub].length; j += 13) { // Это условие определяет точки внизу цилиндра. if ((j / 13) >= cylinderSegments * 15 - 2) { vTest[j + 1] -= (75 + vTest[j + 1]) / 1.3; vTest[j + 4] = -0.3; } } 0 1 2 3 4 5 6 7 8 9 10 11 12 X Y Z | | | | | | | | | | 0.0 75.0 0.0 0.0 1.0 0.0 1.0 0.0 0.0 0.5 0.5 0.0 0.0 16.0 75.0 0.0 0.0 1.0 0.0 1.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 75.0 0.0 0.0 1.0 0.0 1.0 0.0 0.0 0.5 0.5 0.0 0.0 11.3 75.0 11.3 0.0 1.0 0.0 1.0 0.0 0.0 0.9 0.9 0.0 0.0 0.0 75.0 0.0 0.0 1.0 0.0 1.0 0.0 0.0 0.5 0.5 0.0 0.0 0.1 75.0 16.0 0.0 1.0 0.0 1.0 0.0 0.0 0.5 1.0 0.0 0.0 0.0 75.0 0.0 0.0 1.0 0.0 1.0 0.0 0.0 0.5 0.5 0.0 0.0 -11.3 75.0 11.3 0.0 1.0 0.0 1.0 0.0 0.0 0.1 0.9 0.0 0.0 0.0 75.0 0.0 0.0 1.0 0.0 1.0 0.0 0.0 0.5 0.5 0.0 0.0 -16.0 75.0 0.0 0.0 1.0 0.0 1.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 75.0 0.0 0.0 1.0 0.0 1.0 0.0 0.0 0.5 0.5 0.0 0.0 -11.3 75.0 -11.3 0.0 1.0 0.0 1.0 0.0 0.0 0.1 0.1 0.0 0.0 0.0 75.0 0.0 0.0 1.0 0.0 1.0 0.0 0.0 0.5 0.5 0.0 0.0 -0.0 75.0 -16.0 0.0 1.0 0.0 1.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 75.0 0.0 0.0 1.0 0.0 1.0 0.0 0.0 0.5 0.5 0.0 0.0 11.3 75.0 -11.3 0.0 1.0 0.0 1.0 0.0 0.0 0.9 0.1 0.0 0.0 0.0 75.0 0.0 0.0 1.0 0.0 1.0 0.0 0.0 0.5 0.5 0.0 0.0 16.0 75.0 -0.0 0.0 1.0 0.0 1.0 0.0 0.0 1.0 0.5 0.0 0.0 -------------------------------------------------------------------------- 0.0 -75.0 0.0 0.0 -1.0 0.0 1.0 0.0 0.0 0.5 0.5 0.0 0.0 16.0 -75.0 0.0 0.0 -1.0 0.0 1.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 -75.0 0.0 0.0 -1.0 0.0 1.0 0.0 0.0 0.5 0.5 0.0 0.0 11.3 -75.0 11.3 0.0 -1.0 0.0 1.0 0.0 0.0 0.9 0.9 0.0 0.0 0.0 -75.0 0.0 0.0 -1.0 0.0 1.0 0.0 0.0 0.5 0.5 0.0 0.0 0.1 -75.0 16.0 0.0 -1.0 0.0 1.0 0.0 0.0 0.5 1.0 0.0 0.0 0.0 -75.0 0.0 0.0 -1.0 0.0 1.0 0.0 0.0 0.5 0.5 0.0 0.0 -11.3 -75.0 11.3 0.0 -1.0 0.0 1.0 0.0 0.0 0.1 0.9 0.0 0.0 0.0 -75.0 0.0 0.0 -1.0 0.0 1.0 0.0 0.0 0.5 0.5 0.0 0.0 -16.0 -75.0 0.0 0.0 -1.0 0.0 1.0 0.0 0.0 0.0 0.5 0.0 0.0 0.0 -75.0 0.0 0.0 -1.0 0.0 1.0 0.0 0.0 0.5 0.5 0.0 0.0 -11.3 -75.0 -11.3 0.0 -1.0 0.0 1.0 0.0 0.0 0.1 0.1 0.0 0.0 0.0 -75.0 0.0 0.0 -1.0 0.0 1.0 0.0 0.0 0.5 0.5 0.0 0.0 -0.0 -75.0 -16.0 0.0 -1.0 0.0 1.0 0.0 0.0 0.5 0.0 0.0 0.0 0.0 -75.0 0.0 0.0 -1.0 0.0 1.0 0.0 0.0 0.5 0.5 0.0 0.0 11.3 -75.0 -11.3 0.0 -1.0 0.0 1.0 0.0 0.0 0.9 0.1 0.0 0.0 0.0 -75.0 0.0 0.0 -1.0 0.0 1.0 0.0 0.0 0.5 0.5 0.0 0.0 16.0 -75.0 -0.0 0.0 -1.0 0.0 1.0 0.0 0.0 1.0 0.5 0.0 0.0 -------------------------------------------------------------------------- 16.0 75.0 0.0 1.0 0.0 0.0 0.0 0.0 -1.0 0.0 0.0 0.0 0.0 11.3 75.0 11.3 0.7 0.0 0.7 0.7 0.0 -0.7 0.1 0.0 0.0 0.0 0.1 75.0 16.0 0.1 0.0 1.0 1.0 0.0 -0.1 0.3 0.0 0.0 0.0 -11.3 75.0 11.3 -0.7 0.0 0.7 0.7 0.0 0.7 0.4 0.0 0.0 0.0 -16.0 75.0 0.0 -1.0 0.0 0.0 0.0 0.0 1.0 0.5 0.0 0.0 0.0 -11.3 75.0 -11.3 -0.7 0.0 -0.7 -0.7 0.0 0.7 0.6 0.0 0.0 0.0 -0.0 75.0 -16.0 -0.0 0.0 -1.0 -1.0 0.0 0.0 0.8 0.0 0.0 0.0 11.3 75.0 -11.3 0.7 0.0 -0.7 -0.7 0.0 -0.7 0.9 0.0 0.0 0.0 16.0 75.0 -0.0 1.0 0.0 -0.0 -0.0 0.0 -1.0 1.0 0.0 0.0 0.0 -------------------------------------------------------------------------- 16.0 56.3 0.0 1.0 0.0 0.0 0.0 0.0 -1.0 0.0 0.1 0.0 0.0 11.3 56.3 11.3 0.7 0.0 0.7 0.7 0.0 -0.7 0.1 0.1 0.0 0.0 0.1 56.3 16.0 0.1 0.0 1.0 1.0 0.0 -0.1 0.3 0.1 0.0 0.0 -11.3 56.3 11.3 -0.7 0.0 0.7 0.7 0.0 0.7 0.4 0.1 0.0 0.0 -16.0 56.3 0.0 -1.0 0.0 0.0 0.0 0.0 1.0 0.5 0.1 0.0 0.0 -11.3 56.3 -11.3 -0.7 0.0 -0.7 -0.7 0.0 0.7 0.6 0.1 0.0 0.0 -0.0 56.3 -16.0 -0.0 0.0 -1.0 -1.0 0.0 0.0 0.8 0.1 0.0 0.0 11.3 56.3 -11.3 0.7 0.0 -0.7 -0.7 0.0 -0.7 0.9 0.1 0.0 0.0 16.0 56.3 -0.0 1.0 0.0 -0.0 -0.0 0.0 -1.0 1.0 0.1 0.0 0.0 -------------------------------------------------------------------------- 16.0 37.5 0.0 1.0 0.0 0.0 0.0 0.0 -1.0 0.0 0.3 0.0 0.0 11.3 37.5 11.3 0.7 0.0 0.7 0.7 0.0 -0.7 0.1 0.3 0.0 0.0 0.1 37.5 16.0 0.1 0.0 1.0 1.0 0.0 -0.1 0.3 0.3 0.0 0.0 -11.3 37.5 11.3 -0.7 0.0 0.7 0.7 0.0 0.7 0.4 0.3 0.0 0.0 -16.0 37.5 0.0 -1.0 0.0 0.0 0.0 0.0 1.0 0.5 0.3 0.0 0.0 -11.3 37.5 -11.3 -0.7 0.0 -0.7 -0.7 0.0 0.7 0.6 0.3 0.0 0.0 -0.0 37.5 -16.0 -0.0 0.0 -1.0 -1.0 0.0 0.0 0.8 0.3 0.0 0.0 11.3 37.5 -11.3 0.7 0.0 -0.7 -0.7 0.0 -0.7 0.9 0.3 0.0 0.0 16.0 37.5 -0.0 1.0 0.0 -0.0 -0.0 0.0 -1.0 1.0 0.3 0.0 0.0 -------------------------------------------------------------------------- 16.0 18.8 0.0 1.0 0.0 0.0 0.0 0.0 -1.0 0.0 0.4 0.0 0.0 11.3 18.8 11.3 0.7 0.0 0.7 0.7 0.0 -0.7 0.1 0.4 0.0 0.0 0.1 18.8 16.0 0.1 0.0 1.0 1.0 0.0 -0.1 0.3 0.4 0.0 0.0 -11.3 18.8 11.3 -0.7 0.0 0.7 0.7 0.0 0.7 0.4 0.4 0.0 0.0 -16.0 18.8 0.0 -1.0 0.0 0.0 0.0 0.0 1.0 0.5 0.4 0.0 0.0 -11.3 18.8 -11.3 -0.7 0.0 -0.7 -0.7 0.0 0.7 0.6 0.4 0.0 0.0 -0.0 18.8 -16.0 -0.0 0.0 -1.0 -1.0 0.0 0.0 0.8 0.4 0.0 0.0 11.3 18.8 -11.3 0.7 0.0 -0.7 -0.7 0.0 -0.7 0.9 0.4 0.0 0.0 16.0 18.8 -0.0 1.0 0.0 -0.0 -0.0 0.0 -1.0 1.0 0.4 0.0 0.0 -------------------------------------------------------------------------- 16.0 0.0 0.0 1.0 0.0 0.0 0.0 0.0 -1.0 0.0 0.5 0.0 0.0 11.3 0.0 11.3 0.7 0.0 0.7 0.7 0.0 -0.7 0.1 0.5 0.0 0.0 0.1 0.0 16.0 0.1 0.0 1.0 1.0 0.0 -0.1 0.3 0.5 0.0 0.0 -11.3 0.0 11.3 -0.7 0.0 0.7 0.7 0.0 0.7 0.4 0.5 0.0 0.0 -16.0 0.0 0.0 -1.0 0.0 0.0 0.0 0.0 1.0 0.5 0.5 0.0 0.0 -11.3 0.0 -11.3 -0.7 0.0 -0.7 -0.7 0.0 0.7 0.6 0.5 0.0 0.0 -0.0 0.0 -16.0 -0.0 0.0 -1.0 -1.0 0.0 0.0 0.8 0.5 0.0 0.0 11.3 0.0 -11.3 0.7 0.0 -0.7 -0.7 0.0 -0.7 0.9 0.5 0.0 0.0 16.0 0.0 -0.0 1.0 0.0 -0.0 -0.0 0.0 -1.0 1.0 0.5 0.0 0.0 -------------------------------------------------------------------------- 16.0 -18.8 0.0 1.0 0.0 0.0 0.0 0.0 -1.0 0.0 0.6 0.0 0.0 11.3 -18.8 11.3 0.7 0.0 0.7 0.7 0.0 -0.7 0.1 0.6 0.0 0.0 0.1 -18.8 16.0 0.1 0.0 1.0 1.0 0.0 -0.1 0.3 0.6 0.0 0.0 -11.3 -18.8 11.3 -0.7 0.0 0.7 0.7 0.0 0.7 0.4 0.6 0.0 0.0 -16.0 -18.8 0.0 -1.0 0.0 0.0 0.0 0.0 1.0 0.5 0.6 0.0 0.0 -11.3 -18.8 -11.3 -0.7 0.0 -0.7 -0.7 0.0 0.7 0.6 0.6 0.0 0.0 -0.0 -18.8 -16.0 -0.0 0.0 -1.0 -1.0 0.0 0.0 0.8 0.6 0.0 0.0 11.3 -18.8 -11.3 0.7 0.0 -0.7 -0.7 0.0 -0.7 0.9 0.6 0.0 0.0 16.0 -18.8 -0.0 1.0 0.0 -0.0 -0.0 0.0 -1.0 1.0 0.6 0.0 0.0 -------------------------------------------------------------------------- 16.0 -37.5 0.0 1.0 0.0 0.0 0.0 0.0 -1.0 0.0 0.8 0.0 0.0 11.3 -37.5 11.3 0.7 0.0 0.7 0.7 0.0 -0.7 0.1 0.8 0.0 0.0 0.1 -37.5 16.0 0.1 0.0 1.0 1.0 0.0 -0.1 0.3 0.8 0.0 0.0 -11.3 -37.5 11.3 -0.7 0.0 0.7 0.7 0.0 0.7 0.4 0.8 0.0 0.0 -16.0 -37.5 0.0 -1.0 0.0 0.0 0.0 0.0 1.0 0.5 0.8 0.0 0.0 -11.3 -37.5 -11.3 -0.7 0.0 -0.7 -0.7 0.0 0.7 0.6 0.8 0.0 0.0 -0.0 -37.5 -16.0 -0.0 0.0 -1.0 -1.0 0.0 0.0 0.8 0.8 0.0 0.0 11.3 -37.5 -11.3 0.7 0.0 -0.7 -0.7 0.0 -0.7 0.9 0.8 0.0 0.0 16.0 -37.5 -0.0 1.0 0.0 -0.0 -0.0 0.0 -1.0 1.0 0.8 0.0 0.0 -------------------------------------------------------------------------- 16.0 -56.3 0.0 1.0 0.0 0.0 0.0 0.0 -1.0 0.0 0.9 0.0 0.0 11.3 -56.3 11.3 0.7 0.0 0.7 0.7 0.0 -0.7 0.1 0.9 0.0 0.0 0.1 -56.3 16.0 0.1 0.0 1.0 1.0 0.0 -0.1 0.3 0.9 0.0 0.0 -11.3 -56.3 11.3 -0.7 0.0 0.7 0.7 0.0 0.7 0.4 0.9 0.0 0.0 -16.0 -56.3 0.0 -1.0 0.0 0.0 0.0 0.0 1.0 0.5 0.9 0.0 0.0 -11.3 -56.3 -11.3 -0.7 0.0 -0.7 -0.7 0.0 0.7 0.6 0.9 0.0 0.0 -0.0 -56.3 -16.0 -0.0 0.0 -1.0 -1.0 0.0 0.0 0.8 0.9 0.0 0.0 11.3 -56.3 -11.3 0.7 0.0 -0.7 -0.7 0.0 -0.7 0.9 0.9 0.0 0.0 16.0 -56.3 -0.0 1.0 0.0 -0.0 -0.0 0.0 -1.0 1.0 0.9 0.0 0.0 -------------------------------------------------------------------------- 16.0 -75.0 0.0 1.0 0.0 0.0 0.0 0.0 -1.0 0.0 1.0 0.0 0.0 11.3 -75.0 11.3 0.7 0.0 0.7 0.7 0.0 -0.7 0.1 1.0 0.0 0.0 0.1 -75.0 16.0 0.1 0.0 1.0 1.0 0.0 -0.1 0.3 1.0 0.0 0.0 -11.3 -75.0 11.3 -0.7 0.0 0.7 0.7 0.0 0.7 0.4 1.0 0.0 0.0 -16.0 -75.0 0.0 -1.0 0.0 0.0 0.0 0.0 1.0 0.5 1.0 0.0 0.0 -11.3 -75.0 -11.3 -0.7 0.0 -0.7 -0.7 0.0 0.7 0.6 1.0 0.0 0.0 -0.0 -75.0 -16.0 -0.0 0.0 -1.0 -1.0 0.0 0.0 0.8 1.0 0.0 0.0 11.3 -75.0 -11.3 0.7 0.0 -0.7 -0.7 0.0 -0.7 0.9 1.0 0.0 0.0 16.0 -75.0 -0.0 1.0 0.0 -0.0 -0.0 0.0 -1.0 1.0 1.0 0.0 0.0 X Y Z | | | | | | | | | | 0 1 2 3 4 5 6 7 8 9 10 11 12 Еще интересны 9-й и 10-й столбцы, видимо они отражают какой-то порядок следования точек. Первый и второй большие разделы таблицы (по 16 точек) относятся, по всей видимости, к верхнему и нижнему основанию цилиндра, что ясно из их координат. Вот такая шляпа. Может кто-нибудь знает, за что отвечают значения в таблице с индексами 3-12? И кстати, у всех вылезает Context3D Error при просмотре флешки на форуме? Последний раз редактировалось bav; 26.02.2013 в 19:34. |
|
|||||
|
Регистрация: Feb 2011
Адрес: Украина Днепропетровск
Сообщений: 106
|
3,4,5- отвечает за тень, то есть как ее визуализировать и ее интенсивность, в Вашем случии наверно очень важные.
9,10 - это положения текстуры на точке, то есть как растягивать текстуру. |
|
|||||
|
Очень странно с рефракшен методом отражаться тоже должно было все
. Но рефракшен имеет такие свойства как изменение положения текстуры отражения и ее масштабирования, так что мог бы дать более приемлемый эффект. Я кстати не совсем понимаю какого вы эфекта хотите добится, но возможно стоит ковыряться с самим текстур рендером в Рендер текстуре... Хотя все это костыль какой то но возможно выставление другйо камеры, линзы и тд.. при рендере даст нужный эфект |
|
|||||
|
Цитата:
Выложу-ка я код и полные исходники, чтобы было понятно, что и как я делаю, может это поможет найти проблему. Вот главный класс: package { import away3d.containers.*; import away3d.core.base.*; import away3d.entities.*; import away3d.lights.*; import away3d.materials.*; import away3d.materials.methods.*; import away3d.primitives.*; import away3d.textures.*; import away3d.utils.*; import flash.events.*; import flash.geom.*; import flash.ui.*; [SWF(backgroundColor="#000000", frameRate="30", quality="LOW")] public class Main extends Base { // Текстуры [Embed(source = "../lib/images/allum.png")] public static var Allum:Class; [Embed(source = "../lib/images/green_metal.png")] public static var GMetal:Class; [Embed(source = "../lib/images/trinket_diffuse.jpg")] public static var TrinketDiffuse:Class; [Embed(source = "../lib/images/radial_gray_2.jpg")] public static var RadialBlue:Class; [Embed(source = "../lib/images/st.jpg")] public static var Photo:Class; private var reflectionTexture:CubeReflectionTexture; private var reflectiveMaterial : ColorMaterial; private var cylinderSegments:int = 16; private var cylinderRadius:int = 8; private var texs:Array; //setup the cube texture private var cubeTexture:BitmapCubeTexture; private var skyBox:SkyBox; private var b:Boolean = false; private var texture:BitmapTexture; private var material:TextureMaterial; private var atexture:BitmapTexture; private var amaterial:TextureMaterial; // Свет private var light:PointLight; private var light_2:PointLight; // Контейнеры private var _topSquare:ObjectContainer3D; private var _bottomCircle:ObjectContainer3D; private var _legCylinder:ObjectContainer3D; // Меши private var _topSquareMesh:Mesh; private var _legCylinderMesh:Mesh; private var _bottomCircleMesh:Mesh; private var _legMeshes:Vector.<Mesh> = new Vector.<Mesh>(); private var _currLegTexture:int = 0; public function Main() { super(); } override protected function onSetup():void { // Создаем освещение createSun(); // Создаем объекты createObjects(); // Включаем переключение текстур по пробелу stage.addEventListener(KeyboardEvent.KEY_DOWN, clickHand); // Массив переключаемых текстур. texs = [GMetal, TrinketDiffuse, Allum, Photo]; } /** * В этой функции переключаются текстуры. */ private function clickHand(e:KeyboardEvent):void { if (e.keyCode == Keyboard.SPACE) { ++_currLegTexture; if (_currLegTexture == texs.length) _currLegTexture = 0; amaterial.texture = Cast.bitmapTexture( texs[_currLegTexture] ); } } /** * Здесь создаются объекты и настраиваются текстуры. */ private function createObjects():void { // Текстура для SkyBox'а. cubeTexture = new BitmapCubeTexture(Cast.bitmapData(RadialBlue), Cast.bitmapData(RadialBlue), Cast.bitmapData(RadialBlue), Cast.bitmapData(RadialBlue), Cast.bitmapData(RadialBlue), Cast.bitmapData(RadialBlue)); //========================================================================================== // REFLECTION TEXTURE // create reflection texture with a dimension of 512x512x512 reflectionTexture = new CubeReflectionTexture(512); reflectionTexture.farPlaneDistance = 3000; reflectionTexture.nearPlaneDistance = 1; // center the reflection at (0, 0, 0) where our reflective object will be reflectionTexture.position = new Vector3D(0, 0, 0); // setup fresnel method using our reflective texture in the place of a static environment map var fresnelMethod : FresnelEnvMapMethod = new FresnelEnvMapMethod(reflectionTexture); fresnelMethod.normalReflectance = .6; fresnelMethod.fresnelPower = 2; var refractionMethod : RefractionEnvMapMethod = new RefractionEnvMapMethod( cubeTexture ); //setup the reflective material reflectiveMaterial = new ColorMaterial(0x000000); reflectiveMaterial.addMethod(fresnelMethod); // Следующая строка включает refractionMethod. //reflectiveMaterial.addMethod(refractionMethod); // Создание текстур ========================================================================== // Текстура для столешницы material = new TextureMaterial( Cast.bitmapTexture( TrinketDiffuse ) ); material.lightPicker = _lightPicker; // Начальная текстура для нижнего подстолья atexture = Cast.bitmapTexture( Photo ); amaterial = new TextureMaterial( atexture ); amaterial.lightPicker = _lightPicker; // SkyBox skyBox = new SkyBox(cubeTexture); _view.scene.addChild(skyBox); // Создание квадратного стола ================================================================= var topSquareSurfaceGeometry:CubeGeometry = new CubeGeometry( 100, 2, 100, 1, 1, 1, false ); _topSquareMesh = new Mesh( topSquareSurfaceGeometry, material ); _topSquare = new ObjectContainer3D(); _view.scene.addChild( _topSquare ); _topSquareMesh.y = 75; _topSquare.addChild( _topSquareMesh ); // Создание цилиндрической ноги ================================================================= // (массив _legMeshes сохранился с прошлых версий) _legMeshes.push(new Mesh( new CylinderGeometry( cylinderRadius, cylinderRadius, 150, cylinderSegments, cylinderSegments ), reflectiveMaterial )); _legCylinder = new ObjectContainer3D(); _view.scene.addChild( _legCylinder ); _legCylinder.addChild( _legMeshes[_currLegTexture] ); // Колдунство twist(_legCylinder, 1.5); // Создание круглого подстолья ================================================================ var bottomCircleSurfaceGeometry:CylinderGeometry = new CylinderGeometry( 50, 50, 3, 64 ); _bottomCircleMesh = new Mesh( bottomCircleSurfaceGeometry, amaterial ); _bottomCircle = new ObjectContainer3D(); _view.scene.addChild( _bottomCircle ); _bottomCircleMesh.y = -75; _bottomCircle.addChild( _bottomCircleMesh ); } /** * Твиситит все мешы по обьекту * @param content3D * @param twistX * @param twistY * @param twistZ * @param startBool в первый раз создают клон геометриии */ private 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) { 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) { // Вот здесь все изменения ============================================ if ((j / 13) >= cylinderSegments * 15 - 2) { vTest[j + 1] -= (75 + vTest[j + 1]) / 1.3; vTest[j + 4] = -0.3; } // ==================================================================== } subGeom = mesh.subMeshes[iSub].subGeometry as CompactSubGeometry; subGeom.updateData(vTest); } } } } private function createSun():void { // Light objects. light = new PointLight(); light.ambient = 0.3; light.diffuse = 2; light.specular = 0.75; light.x = 500; light.z = 300; light.y = 200; light_2 = new PointLight(); light_2.ambient = 0.3; light_2.diffuse = 2; light_2.specular = 0.75; light_2.x = -500; light_2.z = 300; light_2.y = 200; _lightPicker.lights = [ light, light_2 ]; } override protected function onUpdate():void { reflectionTexture.render(_view); super.onUpdate(); } } } Кстати попытка применить reflectiveMaterial к нижнему плоскому подстолью не приносит желаемого результата – в нем не отражается вертикальная цилиндрическая нога. |
|
|||||
|
Нужно отрендерить ножку на плоскую текстуру, затем положить ее как планар рефлек на подножку. Для ножки отрендерить куб который находится гораздо ближе к ножке либо плоскую стену %)
Добавлено через 5 минут Ах да, для того чтобы отражалось то что нужно нужно игратся с центром отражения . На деле для меня оказалось очень сложно управлять динамическим отражением т.е чтобы оно отражало то что мне нужно и там где нужно. Поэтому я либо рендерю отражение 1 раз на лету и патом использую как текстуру отражения. Либо отражаю заранее подготовленные текстуры. Кроме того динамическое отражение довольно таки сильно грузит систему ![]() |
![]() |
![]() |
Часовой пояс GMT +4, время: 02:53. |
|
|
« Предыдущая тема | Следующая тема » |
|
|