2012-05-14 17 views
6

Vậy là xong. Tôi có một Point3D nhất định. Tôi có một cái máy ảnh. Tôi biết góc nhìn của máy ảnh, là 45 độ; Tôi biết vị trí máy ảnh và vector LookDirection. Bây giờ tôi muốn một số cách để tìm hiểu xem các điểm sẽ được hiển thị cho máy ảnh hay không.Làm thế nào để tìm hiểu xem một Point3D nhất định có nằm trong giới hạn chế độ xem của máy ảnh không?

So p1 Should be visible, p2 should not Cảm ơn những người đã trả lời và nhận xét, nhưng:

  1. Đây không phải là một vấn đề đơn giản đối với tôi. Điều này có vẻ là một điều đơn giản, nhưng tôi không tìm thấy bất kỳ phương pháp đặc biệt hoặc lớp trợ giúp để giải quyết vấn đề. Tôi đã cố gắng giải quyết nó bản thân mình, một cách toán học thuần túy, nhưng giải pháp này là không ổn định và các công trình không thể đoán trước:

    bool isPointInCameraView(Point3D P, Point3D CP, Vector3D LD, double CameraAngle) { 
        //first calculate Distance to the plane formed by normal vector LD and point P on it 
        var D = -LD.X*P.X-LD.Y*P.Y-LD.Z*P.Z; // -AXb-BYb-CZb 
        //L is the distance to the plane. 
        double L = Math.Abs((LD.X * CP.X + LD.Y * CP.Y + LD.Z * CP.Z + D))/Math.Sqrt(LD.X * LD.X +    LD.Y * LD.Y+LD.Z * LD.Z);    
        var BL = L * Math.Tan(CameraAngle); //length of bound part 
        var PL = Math.Sqrt(((new Vector3D(P.X - CP.X, P.Y - CP.Y, P.Z - CP.Z)).LengthSquared - L * L)); // length of point part 
        //test if point is out of bounds! 
        return PL <= BL; 
    } 
    
  2. tôi biết về Helix3D và tôi đang sử dụng nó. Viewport và Camera của tôi là từ khung công tác helix.

Tôi nghĩ rằng sẽ dễ hiểu hơn nếu tôi giải thích lý do tại sao tôi cần loại thử nghiệm này. Tôi đang xây dựng một ứng dụng trực quan hóa địa lý và tôi cần có khả năng phóng to sâu vào kết cấu để xem chi tiết. Vấn đề là tôi không thể sử dụng kết cấu quá lớn, vì chúng sẽ chiếm quá nhiều bộ nhớ và mất quá nhiều thời gian để vẽ. Sau đó tôi quyết định chia máy bay của mình thành một vài hình chữ nhật, mỗi hình chữ nhật phải được xử lý tách biệt nhau. Vì vậy, ý tưởng là khi người dùng phóng to vào phần nào đó của mặt phẳng, tôi sẽ chỉ hiển thị phần đó. Nó hoạt động tốt, ngoại trừ đoạn mã vẫn còn sơn lại kết cấu cho những hình chữ nhật không nhìn thấy được với máy ảnh. Bây giờ tôi muốn tối ưu hóa điều này. Tôi đã thử tìm kiếm bất kỳ chức năng đặc biệt nào để tôi làm điều đó, nhưng không thành công. Vì vậy, bây giờ giải pháp chỉ là toán học và nó không ổn định, nó hoạt động sai. Đó là lý do tại sao tôi hỏi câu hỏi này ở đây.

+0

Điều này có thể phù hợp hơn trên http://math.stackexchange.com/ –

+0

Bạn đã thử những gì? Đây là một vấn đề khá đơn giản, nó sẽ được tốt đẹp để thấy rằng bạn sẽ đặt một số nỗ lực trong ... –

Trả lời

1

Ảnh đẹp!

Tôi nghĩ rằng nó không phải dễ dàng như vậy nếu bạn không có Camera trong Viewport3D. Bạn sẽ cần phải soạn thảo thông qua các biến đổi Visual3D với việc chuyển đổi Camera.

Dễ nhất là đặt nội dung vào Viewport3D. Sau đó, câu hỏi của bạn tương tự như câu hỏi này: Projecting a 3D point to a 2D screen coordinate và câu hỏi này: 3D Projection information.

Lưu ý rằng một số câu trả lời được viết trước .NET 3.5, thêm chức năng trợ giúp Visual3D.TransformToAncestor, có lẽ là những gì bạn cần. Thông tin thêm về TransformToAncestor tại đây: http://blogs.msdn.com/b/wpf3d/archive/2009/05/13/transforming-bounds.aspx.

Và nếu bạn đang làm bất cứ điều gì với WPF 3D, bạn cần biết về sự tuyệt vời Helix Toolkit, thay thế cho 3DTools, chứa các điều khiển chế độ xem và những người trợ giúp khác nhau và đang tích cực làm việc.