Share via


WPFで環境マッピング

WPF 3Dの壁を破ろうシリーズ(?)第3弾です。 

WPFではテクスチャ座標のような頂点単位のデータを動的に変更できないので、基本的には環境マッピングはできません。しかし「WPFでモーフィング」や「WPFでスキニング」と同じようにカメラ方向と法線方向から頂点座標データを毎フレーム生成してやれば実現できます。

球状環境マッピングのテクスチャ座標の生成はそれほど難しくありません。u = Nx/2 + 0.5, v = Ny/2 + 0.5(Nx, Nyはビュー空間での法線ベクトル)を頂点座標に書き込むだけです。詳細はDirect3Dのドキュメントを参照してください。ただしこの式は左手座標系なので、WPFの右手座標系に適用するとき少し変更する必要があります。

しかし、現在よく使われているキューブ環境マッピングはこの手法では適用できません。キューブ環境マッピングでは6つのテクスチャを使用し、法線の方向によって立方体(キューブ)のどの面のテクスチャを使うかを変更する必要があるためです。

private void mySceneChanged(object sender, EventArgs e)

{

    if (this.IsLoaded)

    {

        myScene.Children.Clear();

        myScene.Children.Add(GetTeapot());

    }

}

MeshGeometry3D EditTexCoord(MeshGeometry3D m)

{

    Matrix3D c = myScene.Transform.Value;

    foreach (Vector3D n in m.Normals)

    {

        Vector3D nc = Vector3D.Multiply(n, c);

        Point uv = new Point(nc.X*0.5+0.5, -nc.Y*0.5+0.5);

        m.TextureCoordinates.Add(uv);

    }

    m.Freeze();

    return m;

}

private ModelVisual3D GetTeapot()

{

    MeshGeometry3D myMesh = myTeapot.Clone() ;

    myMesh = EditTexCoord(myMesh);

    GeometryModel3D myGeom = new GeometryModel3D();

    myGeom.Geometry = myMesh;

    myGeom.Material = new DiffuseMaterial(myBrush);

    ModelVisual3D myModel = new ModelVisual3D();

    myModel.Content = myGeom;

    return myModel;

}

Comments

  • Anonymous
    September 13, 2007
    WPF 3D の壁を破ろうシリーズ(?)第4弾です。でも今回は Direct3D などより WPF のほうが得意かもしれません。 Direct3D などでは 3D オブジェクトに張ってあるテクスチャの位置

  • Anonymous
    September 13, 2007
    WPF 3D の壁を破ろうシリーズ(?)第4弾です。でも今回は Direct3D などより WPF のほうが得意かもしれません。 Direct3D などでは 3D オブジェクトに張ってあるテクスチャの位置