2009-11-27 5 views
0

표면 법선에 대한 요청이 있습니다. 다음 코드에서 URL에서입니다 : http://www.kindohm.com/technical/wpf3dtutorial.htm표면 노멀

private Model3DGroup CreateTriangleModel(Point3D p0, Point3D p1, Point3D p2) 
{ 
    MeshGeometry3D mesh = new MeshGeometry3D(); 

    mesh.Positions.Add(p0); 
    mesh.Positions.Add(p1); 
    mesh.Positions.Add(p2); 
    mesh.TriangleIndices.Add(0); 
    mesh.TriangleIndices.Add(1); 
    mesh.TriangleIndices.Add(2); 
    Vector3D normal = CalculateNormal(p0, p1, p2); 
    // 
    mesh.Normals.Add(normal); 
    mesh.Normals.Add(normal); 
    mesh.Normals.Add(normal); 
    // 
    Material material = new DiffuseMaterial(
     new SolidColorBrush(Colors.DarkKhaki)); 
    GeometryModel3D model = new GeometryModel3D(
     mesh, material); 
    Model3DGroup group = new Model3DGroup(); 
    group.Children.Add(model); 
    return group; 

} 

private Vector3D CalculateNormal(Point3D p0, Point3D p1, Point3D p2) 

{ 
    Vector3D v0 = new Vector3D(p1.X - p0.X, p1.Y - p0.Y, p1.Z - p0.Z); 

    Vector3D v1 = new Vector3D(p2.X - p1.X, p2.Y - p1.Y, p2.Z - p1.Z); 

    return Vector3D.CrossProduct(v0, v1); 
} 

이해 할 수없는 이유 코드 라인 "(정상) mesh.Normals.Add;" 3 회 반복한다.

이유를 말해 줄 수 있습니까? 세 포인트의 삼각형을 만드는 것처럼

감사

J.Frank

+0

관련 코드 줄에서 ıs 오류가 있습니까? – Wolfgang

답변

2

는 것 같습니다. 법선은 삼각형의 각 점에 대한 법선입니다. 이 경우 모든 법선들이 같은 방향을 가리키고 있습니다. 즉, 표면 법선과 같습니다.

점 법선을 곡면 법선과 다르게하고 싶을 때가 있습니다. 삼각형이 구체와 같은 물체의 일부일 때처럼 말입니다. 그러면 점 법선이 그 주위의 법선 표면의 평균이되기를 원할 것입니다. 그렇게하면 평평한 음영 대신 매끄러운 음영 처리 및 강조 표시를 할 수 있습니다.

+0

감사합니다. 우리가 큐브와 다른 3D 메쉬 객체를 가지고 있다면 (위의 예제는 큐브 객체에 대한 것입니다), 어떻게 표면 법선을 계산할 수 있습니까? – Wolfgang

+0

코드가 이미 표면 법선을 계산 중입니다. 표면 법선은 삼각형의 두 인접 벡터의 외적입니다. p0 -> p1 및 p0 -> p2의 벡터와 같습니다. 벡터 법선을 계산하려면 먼저 모든 표면 법선을 얻어야합니다. 그런 다음 해당 정점을 공유하는 모든 표면 법선을 평균 (더하기 및 정규화)합니다. 희망이 분명하다. 이것은 몇 가지 수학 개념에 도움이 될 수 있습니다. http://www.gamedev.net/reference/articles/article1443.asp – Rich

관련 문제