Render.ru

again about texture mapping

#1
Вот мой объект -

AttributeBegin
Attribute "identifier" "name" [""]
Color [ 1 1 1 ]
Opacity [ 1 1 1 ]
Attribute "visibility" "integer camera" [ 1 ]
Attribute "visibility" "integer reflection" [ 1 ]
Attribute "visibility" "integer shadow" [ 1 ]
Sides [ 1 ]
Surface "supertexmap"
"string Csmapname" [ "grid.tx" ]
"string Csproj" [ "planar" ]
"float Csmx[16]" [ 0.055 0 0 0 0 0.055 0 0 0 0 1 0 0 0 0 1 ]
CoordinateSystem "object"
AttributeBegin
геометрия
AttributeEnd
AttributeEnd

Сделал текстуру: mkmip -mode clamp -resize up- ....
смасштабировал - Csmx[16] - ....

Получаю - http://www.rooc.com.ua/temp/render1.jpg
вид сверху

теперь двигаю объект -
http://www.rooc.com.ua/temp/render2.jpg

то бишь текстура стоит четко в начале координат, вне зависимости где объект.

Вопросы:
1. Как указать для текстуры локальную систему координат?
2. Как положить текстуру планарно в XZ, ZY и так далее?
3. Как в Shaderman'е к текстуре прицепить тип проекции и матрицу преобразования?

К сожалению Арман еще не дочитал до нужного места :(
 
#2
Вопросы:
1. Как указать для текстуры локальную систему координат?

Перенеси CoordinateSystem "object" вверх, до вызова текстуры.

2. Как положить текстуру планарно в XZ, ZY и так далее?

В данном случае - только через Csmx.

3. Как в Shaderman'е к текстуре прицепить тип проекции и матрицу преобразования?

Пока никак - ручками через s, t. В тестируемой версии есть манифолды, как в RAT'е. Я все еще не придумал, как это сделать по-человечески, и чтобы не было так сильно похоже на RAT ;-)
 
#3
> Перенеси CoordinateSystem "object" вверх, до вызова текстуры.

Не помогает.

Очень жду ShaderMan'а с этим фичером, и документации :)
 
#4
Ты б не рыбу а текст шейдера постил.
Если я правильно понял то в данном случае преобразование в планар
делается на основе P взятой в current (по умолчанию) или world space.
Оттого она и плывет. Нужно предварительно трансформить P в
object или shader space.
 
#5
Понимаешь, я дизайнер, для меня редактировать или писать шейдер задача непростая, тем более для такой банальной задачи.
Мне проще переложить геометрию в LightWave и сделать это тремя кликами.
Но тем не менее я хочу разобраться.

Вот если бы вы мне сделали шейдер(ы), а еще лучше брики для ShaderMan, которые просто по умолчанию проектируют текстуру планарно на объект, я был бы счастлив:)
 
#6
/*---------------------------------------------------------------------------*
* MayaPlanarMap.sl *
* 2000/09/11 ver 1.1 *
* Copyright (c) by Shouichi Matsubar *
* /Shirogumi Inc/ *
* *
* mail to : show@annie.ne.jp *
*---------------------------------------------------------------------------*/

point map_proj_transform( point pos; point trans; point rot; point scal; )
{
point tpos;
float x, y, z;
float co, si, rad;
float rx = xcomp( rot ), ry = ycomp( rot ), rz = zcomp( rot );
/*** Translate XYZ ***/
tpos = point(pos - trans);
/*** Rotate Z ***/
if ( rz != 0.0 ) {
rad = radians( rz );
co = cos( rad );
si = sin( rad );
x = xcomp( tpos );
y = ycomp( tpos );
setxcomp( tpos, ( x * co ) + ( y * si ) );
setycomp( tpos, ( -x * si ) + ( y * co ) );
}
/*** Rotate Y ***/
if ( ry != 0.0 ) {
rad = radians( ry );
co = cos( rad );
si = sin( rad );
x = xcomp( tpos );
z = zcomp( tpos );
setxcomp( tpos, ( x * co ) - ( z * si ) );
setzcomp( tpos, ( x * si ) + ( z * co ) );
}
/*** Rotate X ***/
if ( rx != 0.0 ) {
rad = radians( rx );
co = cos( rad );
si = sin( rad );
y = ycomp( tpos );
z = zcomp( tpos );
setycomp( tpos, ( y * co ) + ( z * si ) );
setzcomp( tpos, ( -y * si ) + ( z * co ) );
}
/*** Scale XYZ ***/
tpos = tpos / scal;
return ( tpos );
}

void maya_plane_map_proj( point pos; output float uu, vv; )
{
uu = (xcomp( pos )+1)/2;
vv = (-ycomp( pos )+1)/2;
}

surface MayaPlanarMap(
float Ks = 1;
float Kd = 1;
float Ka = 0.2;
float roughness = 0.1;
float metalness = 0.6;
string texname = "";
point trans = point (0, 0, 0);
point rot = point (0, 0, 0);
point scal = point (1, 1, 1);
float local = 0;
)
{
vector Ni;
normal Nf;
float ss, tt;
point PP;
color cs;
string map_space = ((local != 0)?"shader":"world");

PP = map_proj_transform( transform(map_space, P ),
transform("shader", trans ),
transform("shader", rot ),
transform("shader", scal ) );
maya_plane_map_proj( PP, ss, tt );
if ( texname != "" )
cs = color texture( texname, ss, tt );
else
cs = Cs;
Nf = faceforward( normalize( N ), I );
Ni = normalize( I );
Oi = Os;
Ci = Os * ( ( cs * ( Ka * ambient() + Kd * diffuse(Nf)) ) +
( Ks * specular(Nf, -Ni, roughness))*
( ( cs * metalness ) + ( 1.0 - metalness ) )
);
}
 
Сверху