游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1333|回复: 0

关于lightmap与多边形顶点的”映射“问题

[复制链接]

5

主题

14

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2006-2-21 14:06:00 | 显示全部楼层 |阅读模式
关于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;


多谢了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-23 11:49

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表