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'?
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:
- vector 3D để được biến đổi được tạo ra.
- Vector được nhân với ma trận Chế độ xem.
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
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
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
Đã 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