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:
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
Kết xuất từ bên 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)?