|
|
关于lightmap与多边形顶点的”映射“问题
前段时间在研究lightmap相关的问题,在lightmap与多边形顶点的映射问题上还有些地方不明白。请大家看看帮帮忙:
//下面的代码来自Quake3
//注意下面用[0],[1],[2]分别代表x,y,z分量,多边形上的顶点都共面,法线为:plane->normal
// bound the surface
ClearBounds( mins, maxs );
verts = ds->verts;
for ( i = 0 ; i < ds->numVerts ; i++ ) {
AddPointToBounds( verts.xyz, mins, maxs ); //求此多边形的边界
}
// round to the lightmap resolution//**(以ssize为基本单位scale尺寸)
for ( i = 0 ; i < 3 ; i++ ) {
exactSize = maxs - mins;
mins = ssize * floor( mins / ssize );
maxs = ssize * ceil( maxs / ssize );
size = (maxs - mins) / ssize + 1;
}
// the two largest axis will be the lightmap size
memset( vecs, 0, sizeof( vecs ) );
planeNormal[0] = fabs( plane->normal[0] );
planeNormal[1] = fabs( plane->normal[1] );
planeNormal[2] = fabs( plane->normal[2] );
//找最接近的轴平行平面作为lightmap平面
if ( planeNormal[0] >= planeNormal[1] && planeNormal[0] >= planeNormal[2] ) {
w = size[1];
h = size[2];
axis = 0;
vecs[0][1] = 1.0 / ssize;
vecs[1][2] = 1.0 / ssize;
}
else if ( planeNormal[1] >= planeNormal[0] && planeNormal[1] >= planeNormal[2] ) {
w = size[0];
h = size[2];
axis = 1;
vecs[0][0] = 1.0 / ssize;
vecs[1][2] = 1.0 / ssize;
}
else {
w = size[0];
h = size[1];
axis = 2;
vecs[0][0] = 1.0 / ssize;
vecs[1][1] = 1.0 / ssize;
}
// set the lightmap texture coordinates in the drawVerts
ds->lightmapNum = numLightmaps - 1; //ID
ds->lightmapWidth = w;
ds->lightmapHeight = h;
ds->lightmapX = x;
ds->lightmapY = y;
for ( i = 0 ; i < ds->numVerts ; i++ ) {
/*
将多边形上的点投影到lightmap面上
这里取mins作为lightmap平面上的原点或基准点,它在lightmap中的坐标为(x,y)。之所以不是(0,0),是因为一张lightmap大小是128*128,可能会被多个多边形分享
*/
VectorSubtract( verts.xyz, mins, delta );
s = DotProduct( delta, vecs[0] ) + x + 0.5; //**投影到s轴得s值
t = DotProduct( delta, vecs[1] ) + y + 0.5; //**投影到t轴得t值
//**convert to [0, 1]
verts.lightmap[0] = s / LIGHTMAP_WIDTH;
verts.lightmap[1] = t / LIGHTMAP_HEIGHT;
}
// calculate the world coordinates of the lightmap samples
//问题:
======================================================================================
// project mins onto plane to get origin
d = DotProduct( mins, plane->normal ) - plane->dist;
//下面在做什么?
d /= plane->normal[ axis ]; //**这里为什么是除?
VectorCopy( mins, origin );
origin[axis] -= d;
// project stepped lightmap blocks and subtract to get planevecs
for ( i = 0 ; i < 2 ; i++ ) {
vec3_t normalized;
float len;
len = VectorNormalize( vecs, normalized );
//下面在做什么?
VectorScale( normalized, (1.0/len), vecs ); //**为什么还要除以len?
d = DotProduct( vecs, plane->normal );
d /= plane->normal[ axis ];
vecs[axis] -= d;
}
======================================================================================
VectorCopy( origin, lightmapOrigin ); //origin
VectorCopy( vecs[0], lightmapVecs[0] ); //**s轴
VectorCopy( vecs[1], lightmapVecs[1] ); //**t轴
这样如果要求lightmap中某pixel对应的顶点坐标,则用下面方式求出:
for ( k = 0 ; k < 3 ; k++ ) {
position[k] = lightmapOrigin[k] + normal[k]
+ i * lightmapVecs[0][k]
+ j * lightmapVecs[1][k];
现在的问题是:
//下面在做什么?
d /= plane->normal[ axis ]; //**这里为什么是除?
VectorCopy( mins, origin );
origin[axis] -= d;
//下面在做什么?
VectorScale( normalized, (1.0/len), vecs ); //**为什么还要除以len?
d = DotProduct( vecs, plane->normal );
d /= plane->normal[ axis ];
vecs[axis] -= d;
多谢了
|
|