Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   API приложений и сред (http://www.flasher.ru/forum/forumdisplay.php?f=61)
-   -   Away3d chrome material (http://www.flasher.ru/forum/showthread.php?t=194490)

bav 15.02.2013 13:37

Away3d chrome material
 
Вложений: 1
Привет, товарищи :)
Делал ли кто-нибудь в 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, но и нижнюю цилиндрическую ногу?
table.swf   (844.4 Кб)


UPD: у меня при попытке просмотра флешки на форуме вылезает Context3d error. При скачивании и локальном запуске все нормально.

bav 21.02.2013 14:10

Вложений: 1
Привет еще раз :)
Я оказался слеп и не заметил, что эта демка с отражающей головой вполне себе мило предоставляет исходники. Достаточно было кликнуть правой кнопкой и вот они 'View source'. Однако, этот отражающий материал никак не хочет "красиво" работать на цилиндрической поверхности. На более или менее сферических поверхностях – сказка! А вот с цилиндром туго. Собственно приложу демку, в которой можно нажимать пробел и смотреть различные объекты (цилиндр, конус, сфера, капсула, тор, параллелепипед) с этим материалом, чтобы понять о чем я говорю.

Есть ли у кого-нибудь мысли, как и цилиндр сделать былью?
table_2.swf   (847.1 Кб)

iflamberg 21.02.2013 15:04

Я бы стучался на родной форум Away3d и там бы спрашивал, тут слишком мала концентрация людей, знакомых с away3d, а уж таких, которые бы заморачивались отражающими поверхностями...

vorodis2 21.02.2013 16:34

я бы не сказал что форум 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);
                                        }
                                }                       
                        }               
                }


Asfel 22.02.2013 22:47

А какой метод отражения используется? Мне кажется тут рефракшен поможет достичь нужного эфекта.. Правда у него нельзя маску для отражения по спекуляру задавать
Кстати еще скажу что с динамическим отражением, лучше его отрендерить один раз :). Все таки он довольно нагрузный. Конечно если не нужно динамику видить активно, а просто окружение.

bav 26.02.2013 17:40

Вложений: 1
Asfel, используется метод FresnelEnvMapMethod. Попытка использования RefractionEnvMapMethod ни к чему хорошему не привела – начинает отражаться один только SkyBox, а нужно чтобы отражались и другие объекты.
vorodis2, спасибо на информацию. Немного поколдовав с точками меша, удалось добиться лучшего эффекта (но все же недостаточного, см. приложение). Что, по сути, произошло: я сдвинул точки, образующие боковую поверхность цилиндра, по оси Y вниз, и экспериментальным путем определил значение для еще одной магической переменной в массиве, описывающем точки.
Код AS3:

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;
        }
}

Вообще я попробовал вывести все числа из vertexData для цилиндра (радиус = 8, высота = 150, вертик.сегменты = 8, горизонт.сегменты = 8) и разобраться что за что отвечает. Получилось такая таблица (здоровенная):
Код:

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

Из нее становится видно, что те самые еретические 0, 1, 0, 1, 0, 0, не одинаковы для всех вершин. Кроме того между некоторыми столбцами наблюдается закономерность:
Код:

[3] - это [0] / diameter
 [5] - это [2] / diameter
 [8] - это [3] * -1

Еще интересны 9-й и 10-й столбцы, видимо они отражают какой-то порядок следования точек. Первый и второй большие разделы таблицы (по 16 точек) относятся, по всей видимости, к верхнему и нижнему основанию цилиндра, что ясно из их координат.
Вот такая шляпа.
table_3.swf   (716.6 Кб)


Может кто-нибудь знает, за что отвечают значения в таблице с индексами 3-12?
И кстати, у всех вылезает Context3D Error при просмотре флешки на форуме?

vorodis2 26.02.2013 19:27

3,4,5- отвечает за тень, то есть как ее визуализировать и ее интенсивность, в Вашем случии наверно очень важные.
9,10 - это положения текстуры на точке, то есть как растягивать текстуру.

Asfel 26.02.2013 19:45

Очень странно с рефракшен методом отражаться тоже должно было все :). Но рефракшен имеет такие свойства как изменение положения текстуры отражения и ее масштабирования, так что мог бы дать более приемлемый эффект. Я кстати не совсем понимаю какого вы эфекта хотите добится, но возможно стоит ковыряться с самим текстур рендером в Рендер текстуре... Хотя все это костыль какой то но возможно выставление другйо камеры, линзы и тд.. при рендере даст нужный эфект

bav 26.02.2013 20:52

Вложений: 3
Цитата:

3,4,5- отвечает за тень, то есть как ее визуализировать и ее интенсивность, в Вашем случии наверно очень важные.
Это несомненно :-)
Выложу-ка я код и полные исходники, чтобы было понятно, что и как я делаю, может это поможет найти проблему.
Вот главный класс:
Код AS3:

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();
                }
 
        }
}

А вот чего хочется:
Вложение 29192
Кстати попытка применить reflectiveMaterial к нижнему плоскому подстолью не приносит желаемого результата – в нем не отражается вертикальная цилиндрическая нога.

Asfel 26.02.2013 21:23

Нужно отрендерить ножку на плоскую текстуру, затем положить ее как планар рефлек на подножку. Для ножки отрендерить куб который находится гораздо ближе к ножке либо плоскую стену %)

Добавлено через 5 минут
Ах да, для того чтобы отражалось то что нужно нужно игратся с центром отражения

Код:

reflectionTexture.position = new Vector3D()
.

На деле для меня оказалось очень сложно управлять динамическим отражением т.е чтобы оно отражало то что мне нужно и там где нужно. Поэтому я либо рендерю отражение 1 раз на лету и патом использую как текстуру отражения. Либо отражаю заранее подготовленные текстуры. Кроме того динамическое отражение довольно таки сильно грузит систему :)


Часовой пояс GMT +4, время: 23:16.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.