注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Code@Pig Home

喜欢背着一袋Code傻笑的Pig .. 忧美.欢笑.记忆.忘却 .之. 角落

 
 
 

日志

 
 

[c++] 导出 vertex normal  

2011-12-07 11:43:15|  分类: 3d_3dmax |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
导出 normal  需要自己计算,不能用 Mesh 上的现有函数,那些normal相关函数是internal use only

计算 face normal
------------------------------------------------------------------
    TriObject *tri = (TriObject *)obj->ConvertToType(t_, triObjectClassID);
    Mesh &mesh = tri->GetMesh();

    int n;
    Point3 v0, v1, v2;
    for (n=0; n<mesh.numFaces; n++)
    {
        Face &face = mesh.faces[n];
        
        v0 = mesh.verts[face.v[0]];
        v1 = mesh.verts[face.v[1]];
        v2 = mesh.verts[face.v[2]];

        Point3 faceNormal = (v1-v0)^(v2-v1);
        faceNormal = Normalize(faceNormal);
        fprintf(fp, "triangle #%d, normal(%.2f,%.2f,%.2f)\n", n, faceNormal.x, faceNormal.y, faceNormal.z);
    }
------------------------------------------------------------------

计算 vertex normal (受每个face normal影响综合得出的normal)
------------------------------------------------------------------
class VNormal
{
private:
    Point3 norm_;
    DWORD smooth_;
    VNormal *next_;
    BOOL init_;

public:
    VNormal()
    {
        smooth_ = 0;
        next_   = NULL;
        init_   = FALSE;
        norm_   = Point3(0,0,0);
    }

    VNormal(const Point3 &n, DWORD s)
    {
        next_   = NULL;
        init_   = TRUE;
        norm_   = n;
        smooth_ = s;
    }

    ~VNormal()
    {
        delete next_;
    }

    void AddNormal(const Point3 &n, DWORD s)
    {
        if (!(s&smooth_) && init_)
        {
            if (next_)
                next_->AddNormal(n, s);
            else
                next_ = new VNormal(n, s);
        }
        else
        {
            norm_ += n;
            smooth_ |= s;
            init_ = TRUE;
        }
    }

    Point3& VNormal::GetNormal(DWORD s)
    {
        if (smooth_&s || !next_) return norm_;
        else return next_->GetNormal(s);
    }

    void Normalize()
    {
        VNormal *ptr = next_, *prev = this;
        while (ptr)
        {
            if (ptr->smooth_ & smooth_)
            {
                norm_ += ptr->norm_;
                prev->next_ = ptr->next_;
                delete ptr;
                ptr = prev->next_;
            }
            else
            {
                prev = ptr;
                ptr  = ptr->next_;
            }
        }
        norm_ = ::Normalize(norm_);
        if (next_) next_->Normalize();
    }
};

...
    TriObject *tri = (TriObject *)obj->ConvertToType(t_, triObjectClassID);
    Mesh &mesh = tri->GetMesh();

    int i, n;
    Point3 v0, v1, v2;
    Tab<VNormal> vnorms;

    vnorms.SetCount(mesh.numVerts);
    for (i=0; i<mesh.numVerts; i++)
        vnorms[i] = VNormal();

    for (n=0; n<mesh.numFaces; n++)
    {
        Face &face = mesh.faces[n];

        v0 = mesh.verts[face.v[0]];
        v1 = mesh.verts[face.v[1]];
        v2 = mesh.verts[face.v[2]];
        Point3 faceNormal = (v1-v0)^(v2-v1);

        for (i=0; i<3; i++)
        {
            vnorms[face.v[i]].AddNormal(faceNormal, mesh.faces->smGroup);
        }
    }

    for (i=0; i<mesh.numVerts; i++)
        vnorms[i].Normalize();

    for (i=0; i<mesh.numVerts; i++)
    {
        Point3 n = vnorms[i].GetNormal(0);
        fprintf(fp, "vertex #%d, normal(%.2f,%.2f,%.2f)\n", i, n.x, n.y, n.z);
    }
------------------------------------------------------------------

参考资料
3ds Max Programmer's Guide
  Working with Objects
    Working with Meshes
      Computing Face and Vertex Normals
  评论这张
 
阅读(762)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017