2010-07-25 28 views
8

Tôi đang viết bộ quét phần mềm của riêng tôi trong Java, và tôi chạy vào một số rắc rối với nó ... hãy nhìn vào một hình ảnh mẫu, vui lòng:Chiếu phối cảnh - làm cách nào để chiếu các điểm phía sau 'máy ảnh'?

Image

Mẫu này chỉ cần vẽ lưới vuông đơn giản trên máy bay. Tất cả mọi thứ hoạt động tốt cho đến khi tôi di chuyển máy ảnh đủ gần cho một số điểm để di chuyển phía sau nó. Sau đó, chúng không còn được chiếu chính xác nữa, như bạn có thể thấy (các đường thẳng đứng - các điểm nằm phía sau máy ảnh được chiếu trên đầu màn hình).

Ma trận và vectơ chuyển đổi của tôi giống như những DirectX đang sử dụng (PerspectiveFovLH cho phép chiếu, LookAtLH cho máy ảnh).

Tôi đang sử dụng phương pháp chuyển đổi sau vào dự án điểm 3D:

  1. vector 3D để được biến đổi được tạo ra.
  2. Vector được nhân với ma trận Chế độ xem.
  3. Sau đó, điểm được chuyển đến màn hình sử dụng phương pháp sau đây:

    // 'vector' is input vector in projection space 
    // projection to screen 
    double vX = vector.x/vector.z;   
    double vY = vector.y/vector.z; 
    
    //translate 
    //surfaceW is width and surfaceH is height of the rendering window. 
    vX = ((vX + 1.0f)/2.0f) * surfaceW; 
    vY = ((-vY + 1.0f)/2.0f) * surfaceH; 
    
    return new Vector3(vX, vY, vector.z); 
    

Như tôi đã nói trước đó, nó hoạt động tốt cho đến khi di chuyển điểm đằng sau máy ảnh. Thực tế là, tôi có thể tìm ra khi điểm đằng sau camera (bằng cách kiểm tra giá trị Z của nó sau khi biến đổi cuối cùng), nhưng vì tôi vẽ các đường thẳng và các đối tượng dựa trên đường khác, tôi không thể bỏ qua điểm đó.

Sau đó, tôi đã thử đặt đường dẫn chuyển đổi của mình theo Đường ống chuyển đổi Direct3D bài viết trên MSDN.

Thật không may, tôi cũng không có bất kỳ may mắn nào với điều đó (cùng kết quả), vì vậy mọi trợ giúp sẽ được đánh giá cao, vì tôi hơi bị mắc kẹt trong vấn đề này.

Cảm ơn bạn.

Best Regards, Alex

+0

Bạn có đang thiết lập mặt cắt cắt chính xác của máy ảnh không? Và sau đó đưa nó vào tài khoản khi rendering? – ChrisF

+0

Mặt phẳng zNear của tôi được đặt thành 1 và mặt phẳng zFar thành 1000 đơn vị. Tôi đã thử thay đổi các giá trị, nhưng vấn đề vẫn tồn tại. Bất kỳ đề xuất? – Alex

+0

Đã lâu rồi tôi mới làm điều này, nhưng bạn cần phải thực hiện một giao lộ với mặt cắt cắt phía trước * trước khi * chiếu đường thẳng. – ChrisF

Trả lời

7

Bạn cần phải giao với phù hợp với mặt phẳng cắt phía trước trong không gian 3d và cắt dòng vì vậy bạn chỉ vẽ đoạn thẳng đó là có thể nhìn thấy:

   | 
      | 
      | 
x------------+-----------o 
      | 
      | 
      | * - camera 
      | 
      | 
      | 
     clipping plane 

Bạn' ve có một dòng xo trong đó x ở phía trước mặt cắt và o đằng sau nó. Giao điểm này với mặt cắt cắt để tạo ra điểm +. Bạn biết rằng trong số xo hiển thị để vẽ đường từ x đến +.

Bằng cách này, bạn không chiếu các điểm phía sau máy ảnh.

+1

Cảm ơn bạn.Có OK nếu tôi làm điều đó trong không gian clip, sau khi chuyển đổi phối cảnh, trước khi phân chia phối cảnh (sử dụng các tọa độ đồng nhất và w)? – Alex

+2

Có bằng mọi cách. –

Các vấn đề liên quan