Hình ảnh được hiển thị từ bên trên và bên dưới bằng máy ảnh Chính tả không khớp


8

Tôi đang sử dụng một máy ảnh chính tả để hiển thị các lát cắt của một mô hình (để voxelize nó). Tôi kết xuất từng lát cắt từ trên và dưới để xác định những gì bên trong mỗi lát.

Mô hình tôi kết xuất là hình dạng 'T' đơn giản được xây dựng từ hai hình khối. Các hình khối có cùng kích thước và có cùng tọa độ Y (chiều cao). Đây là kết xuất của nó trong Blender:

Mô hình T

Tôi kết xuất mô hình này một lần trực tiếp từ bên trên và một lần trực tiếp từ bên dưới. Kỳ vọng của tôi là tôi sẽ có được cùng một hình ảnh (ngoại trừ việc phản chiếu qua trục y). Tuy nhiên, khi tôi kết xuất bằng cách sử dụng mục tiêu kết xuất có độ phân giải rất thấp (25x25), vị trí (tính bằng pixel) của 'T' sẽ khác khi được hiển thị từ phía trên so với hiển thị từ bên dưới. Xem hình 2 và 3. Các khối màu hồng không phải là một phần của kết xuất ban đầu nhưng tôi đã thêm chúng để bạn có thể dễ dàng đếm / thấy sự khác biệt.

Kết xuất từ ​​trên cao Từ phía trên

Kết xuất từ ​​bên dưới Từ phía dưới

Điều này có lẽ là do những gì tôi đã đọc về tọa độ pixel và texel có thể bị lệch về phía trên bên trái khi nhìn từ camera. Vì tôi đang sử dụng cùng một vectơ 'lên' cho cả hai máy ảnh của tôi, độ lệch của tôi chỉ hiển thị trên trục x. Tôi đã cố gắng thay đổi vị trí của máy ảnh và nó trông giống như những gì tôi nghĩ, nên là một nửa pixel. Tôi đã thử cả hai việc chuyển một camera và chuyển cả hai camera và trong khi tôi thấy một số hiệu ứng tôi không thể có được một bản sao hoàn hảo từng pixel từ cả hai camera.

Ở đây tôi khởi tạo máy ảnh và tính toán, những gì tôi tin là, một nửa pixel. BoundDimX và boundDimZ là một hộp giới hạn mở rộng một chút xung quanh mô hình mà tôi cũng sử dụng làm chiều rộng và chiều cao của âm lượng hình ảnh của máy ảnh chính tả.

Matrix projection = Matrix.CreateOrthographic(boundsDimX, boundsDimZ, 0.5f, sliceHeight + 0.5f);
Vector3 halfPixel = new Vector3(boundsDimX / (float)renderTarget.Width, 0, 
    boundsDimY / (float)renderTarget.Height) * 0.5f;

Đây là mã nơi tôi đặt vị trí camera và camera nhìn ats

  // Position camera                      
                if (downwards)
                {
                    float cameraHeight = bounds.Max.Y + 0.501f - (sliceHeight * i);
                    Vector3 cameraPosition = new Vector3
                    (
                        boundsCentre.X, // possibly adjust by half a pixel?
                        cameraHeight,
                        boundsCentre.Z
                    );
                    camera.Position = cameraPosition;
                    camera.LookAt = new Vector3(cameraPosition.X, cameraHeight - 1.0f, cameraPosition.Z);

                }
                else
                {
                    float cameraHeight = bounds.Max.Y - 0.501f - (sliceHeight * i);
                    Vector3 cameraPosition = new Vector3
                    (
                        boundsCentre.X,
                        cameraHeight,
                        boundsCentre.Z
                    );
                    camera.Position = cameraPosition;
                    camera.LookAt = new Vector3(cameraPosition.X, cameraHeight + 1.0f, cameraPosition.Z);
                }

Câu hỏi chính Bây giờ bạn đã thấy tất cả các vấn đề và mã bạn có thể đoán nó. Câu hỏi chính của tôi là. Làm cách nào để tôi căn chỉnh cả hai camera để mỗi camera hiển thị chính xác cùng một hình ảnh (được nhân đôi dọc theo trục Y)?


Giải pháp cho đến nay dường như là di chuyển máy ảnh chụp ảnh từ bên dưới chính xác một pixel sang trái (-x). Tuy nhiên tôi không thể giải thích tại sao và do đó không thể đảm bảo rằng nó sẽ hoạt động cho mọi thứ tôi ném vào nó. Có ý kiến ​​gì không?
Roy T.

Bạn có nghĩ về việc giữ mọi thứ đúng vị trí, nhưng nhân tỷ lệ Y của mô hình (hình khối) lên -1 không? Sau đó, bạn sẽ có tất cả giống nhau ngoại trừ các đối tượng được lật. PS Tất nhiên bạn cũng sẽ cần -1 các mặt chuẩn và đa giác.
Kromster

Đó thực sự là một ý tưởng tuyệt vời
Roy T.

Kể từ khi bạn chấp thuận, tôi đã đăng nó như một câu trả lời. Hãy cho tôi biết nếu nó làm việc cho bạn!
Kromster

Câu trả lời:


2

Đây là một quan điểm khác nhau về vấn đề được trình bày, có thể giúp tránh các vấn đề khác biệt rasterization

Bạn đã xem xét giữ mọi thứ đúng vị trí, nhưng nhân rộng Y của mô hình (hình khối) theo '-1' dọc theo mặt phẳng tiết diện? Sau đó, bạn sẽ có mọi thứ giống hệt nhau ngoại trừ các đối tượng bị lộn ngược - có nghĩa là bạn sẽ có được mặt trái của chúng cho mục tiêu của mình. Tất nhiên, bạn cũng sẽ cần '-1' các thông số và đa giác đối diện với các hướng.


Mặc dù câu trả lời của bạn không giải thích được tại sao phương pháp của tôi không hiệu quả. (Và đó là nơi tiền thưởng dành cho) Tôi sẽ không trao tiền thưởng ngay bây giờ. Nhưng bởi vì đó là một gợi ý tốt, tiền thưởng 50% tự động sẽ được trao cho bạn trong một ngày và tôi nghĩ bạn xứng đáng với điều đó :).
Roy T.

@RoyT.: Âm thanh công bằng. Tuy nhiên, bạn vẫn phải nói với chúng tôi, nếu giải pháp được đề xuất đã giải quyết vấn đề của bạn - để những người khác gặp phải vấn đề tương tự sẽ biết cách xử lý.
Kromster
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.