Cách trộn hai camera khi đi qua cổng trong Unity3D


18

Trước khi tôi nhận được câu hỏi của mình, tôi biết giải pháp rõ ràng nhất là sử dụng chỉnh lưu cổng xem được chuẩn hóa, tuy nhiên tôi cần hình dạng phức tạp hơn hình chữ nhật và tôi đã xem xét sử dụng chỉnh sửa cổng xem và dường như không là giải pháp của tôi

EDIT: Một số người đã bối rối trước câu hỏi của tôi, hãy để tôi đi vào chi tiết hơn một chút. nhập mô tả hình ảnh ở đây Điều đang xảy ra là khi người chơi chuyển sang một cổng, tôi tạo một bộ điều khiển FPS nhân bản và di chuyển nó ra khỏi cổng khác. Điều này mang lại cho tôi hai máy ảnh và chế độ xem bạn nhìn thấy ở bên phải. Nó chỉ hiển thị một camera và cắt qua cổng. Những gì tôi muốn là một cái gì đó tương tự như thế nàynơi các máy ảnh hòa trộn để tạo ra ảo ảnh của một sự chuyển tiếp suôn sẻ. Những gì tôi muốn làm là xóa mọi thứ từ hình ảnh kiểm tra màu xanh lá cây sang bên trái trong hình ảnh bên dưới, và thay thế nó bằng máy ảnh khác. Bằng cách đó, bạn có được một phần của chế độ xem của camera A đang lọt ra khỏi cổng, được pha trộn với một phần của chế độ xem của camera B vượt ra khỏi cổng khác, để có được một hình ảnh hoàn chỉnh. Và khi bạn di chuyển qua cổng, sự thay đổi phù hợp.

Tôi đã thiết kế một hệ thống cổng thông tin, tôi có mọi thứ, bao gồm cả việc giúp người chơi di chuyển trơn tru qua cổng. Vấn đề chính của tôi bây giờ là có được hiệu ứng pha trộn camera. Tôi cần hai camera để hòa trộn với nhau một cách liền mạch, như thể bạn đang thò đầu qua cổng. Và nó không thể chỉ là một hình chữ nhật, nó phải khớp với tuy nhiên người chơi đang nhìn qua cổng.

Hướng dẫn tốt nhất của tôi về vấn đề này ngay bây giờ là có thể chiếu một shader mặt nạ sâu phía sau mỗi cổng, sau đó làm cho máy ảnh từ cổng bạn đang di chuyển chỉ có chiều sâu. Sau đó bằng cách nào đó trộn hai camera. Vấn đề chính của tôi là tìm ra chính xác cách tôi làm điều này, làm thế nào để camera thứ hai chỉ hiển thị những gì bên ngoài cổng và mặc định phần còn lại là camera 1 để có được một màn hình chiếu toàn màn hình.

Nếu bạn có thể cho tôi ý tưởng, hoặc giải thích làm thế nào tôi có thể làm điều này với shader mặt nạ sâu sẽ là một trợ giúp to lớn. Tôi sẽ tiếp tục làm việc này và cập nhật khi tôi vượt qua.


5
Bạn có thể giải thích "hiệu ứng pha trộn camera" là gì không? Tôi đã hiểu rằng trong cổng thông tin kết xuất một camera là đủ. Trong các trò chơi của người thứ nhất, nó được gắn vào người chơi và được tự động chuyển sang vị trí mới khi đi qua cổng cùng với người chơi. Để hiển thị hiệu ứng cổng thông tin, một bản sao được chuyển đổi của cảnh được hiển thị. Điều này cũng có thể đạt được với máy ảnh thứ hai, nhưng không cần phải trộn lẫn giữa các máy ảnh này.
msell

1
Tôi đã có hiệu ứng hình ảnh xuống hoàn hảo. Những gì tôi đang cố gắng làm là tìm ra cách để có được hiệu quả của việc đi qua cổng. Tôi đã có tất cả đồ họa nhân vật và di chuyển trơn tru như vậy, tôi chỉ cần nó trông mượt mà từ góc nhìn người thứ nhất.
Timothy Williams

1
Tôi chắc rằng nhiều người muốn giúp bạn giải quyết vấn đề nếu họ hiểu nó là gì. Bạn thực sự cần phải giải thích vấn đề tốt hơn, có thể thêm hình ảnh hoặc thậm chí một video trực quan hóa những gì sai.
msell

2
Bạn có thể thêm một liên kết đến một video ví dụ về hiệu ứng?
Mike Baxter

2
Nếu bạn chỉ sử dụng một bộ điều khiển camera / FPS thì sao? Khi camera di chuyển qua cổng, bạn có thể chuyển đổi nó sang vị trí và hướng mới. Nếu kết xuất cổng thông tin là chính xác, quá trình chuyển đổi sẽ liền mạch và không cần pha trộn.
msell

Câu trả lời:


6

Hiểu vấn đề

Từ những gì tôi có thể thấy vấn đề bạn đang mô tả là kết quả của mặt phẳng gần máy ảnh giao với mặt phẳng được xác định bởi cổng thông tin. Trong khi giao lộ này xảy ra, bạn có thể thấy đằng sau bức tường, cổng được bật.

Điều này tương tự như một vấn đề có kinh nghiệm trong các trò chơi khác khi người chơi chỉ đang chuyển từ trên mặt nước sang dưới nước. Nếu máy ảnh ở ngay trên mặt nước, không có hiệu ứng xử lý bài nào được áp dụng để làm xáo trộn chế độ xem của người chơi (làm cho nó tối và mờ và có màu xanh). Vì vậy, nếu đáy của mặt phẳng gần ngay dưới nước, người chơi có thể nhìn rõ dưới nước.

Nếu tôi đúng, bạn có thể xác nhận nó bằng cách thay đổi vị trí của mặt phẳng này khi xác định ma trận chiếu. Khi khoảng cách từ nguồn gốc camera đến mặt phẳng gần tăng lên, vấn đề sẽ xảy ra.

Giải pháp dễ dàng

Làm cho mặt phẳng gần rất gần với máy ảnh sẽ gần như xóa bỏ vấn đề này. Giải pháp này không phải là một giải pháp hoàn chỉnh, nhưng sẽ mang lại kết quả đủ tốt trong phần lớn các trường hợp và nó hiệu quả.

Giải pháp đầy đủ

Nếu chỉ đặt mặt phẳng gần máy ảnh không thỏa mãn, thì bạn có thể tạo một "mặt nạ" để trộn các hình ảnh được tạo bằng cách hiển thị cảnh từ phối cảnh trình phát và cổng.

Giả sử bạn chỉ cho phép các cổng được áp dụng cho các bề mặt phẳng, bạn có thể tính toán đường giao nhau giữa mặt phẳng gần của máy ảnh và mặt phẳng được xác định bởi cổng (hoặc tường nằm trên đó). Dòng này sẽ chia màn hình thành hai phần. Xác định phía nào của dòng pixel màn hình được bật sẽ cho bạn biết nên sử dụng hình ảnh kết xuất nào, hình ảnh cổng thông tin hoặc hình ảnh camera của người chơi.

Hãy nhớ rằng nếu sự cố này xảy ra thì sự thất vọng của camera phải hoàn toàn nằm trong cổng để đường giao nhau sẽ luôn bị cắt hoàn toàn từ cạnh màn hình này sang cạnh màn hình khác.

Liên kết này sẽ giúp với các toán học để tìm dòng. Các mã dưới đây nên được khoảng chính xác.

Đường giao nhau được xác định bằng cách sử dụng một điểm trên đường và hướng đường. Bên dưới hướng giao cắt được tính bằng cách sử dụng sản phẩm chéo của cổng thông thường và hướng xem camera (gần mặt phẳng bình thường). Một điểm trên đường thẳng được đưa ra bằng cách chiếu một tia từ một điểm trên mặt phẳng gần trực tiếp về mặt phẳng cổng thông tin (dọc theo cổng thông thường) và tìm điểm giao nhau.

Vector3 intersectionDir = Vector3.cross(portalNorm, viewDir);
Ray ray = new Ray(camPos + viewDir * camNearPlaneDist, portalNorm);
Vector3 intersectionPos = ray.intersects(new Plane(portalVert1, portalVert2, portalVert3);

Hãy chắc chắn rằng viewDir là một vector đơn vị. PortalVert1, 2 và 3 chỉ là 3 trong số 4 đỉnh được sử dụng cho decal cổng thông tin hoặc bề mặt của nó. Có nhiều cách khác để xác định mặt phẳng mà cổng nằm, nhưng tôi cho rằng đây là thông tin có sẵn nhất.

Khi bạn có hai vectơ này để xác định đường giao nhau nhân với mỗi khung nhìn và sau đó chiếu ma trận để có được chúng trong không gian màn hình.

Sau đó, bạn có thể sử dụng một shader quá trình bài để trộn các hình ảnh này. Bạn chọn hình ảnh nào sẽ sử dụng ở mỗi pixel bằng cách xác định phía nào của đường phân chia mà pixel hiện tại nằm trên. Điều này được thực hiện bằng cách lấy vị trí pixel (cũng là vị trí bạn sử dụng để tra cứu mục tiêu kết xuất texel) và thực hiện;

float d = (pixelX - intersectionPos.X) * intersectionDir.Y - (pixelY - intersectionPos.Y) * intersectionDir.X;

Bên được đưa ra bởi dù d nhiều hơn hoặc nhỏ hơn 0. Nếu chính xác là 0, thì bạn đang ở trên dòng.

Để tham khảo về các toán học ở trên xem điều này .

Phương pháp này cũng có thể được sử dụng khi tạo bộ đệm mặt nạ sâu / stpson để sử dụng trước khi kết xuất từ ​​phối cảnh cổng thông tin. Bạn có thể tạo một quad toàn màn hình và sử dụng dòng để cắt nó.


Máy bay clip gần là một ý tưởng tốt, nhưng không chính xác những gì tôi đang tìm kiếm. Đó là phần thứ hai là một cách tiếp cận thú vị. Hiện tại tôi đang sử dụng trình tạo bóng mặt nạ sâu trên mọi thứ phía sau mặt phẳng cổng thông tin thoát hiểm, sau đó chỉ đặt cờ rõ ràng của máy ảnh thoát thành độ sâu. Điều này làm cho nó trở thành bất kỳ phần nào của máy ảnh thoát ra khỏi cổng được vẽ trên màn hình và camera nhập vào mặt nạ độ sâu, do đó, nó tạo ra một hình ảnh bằng cách trộn các phần của mỗi camera đang ló ra khỏi nó cổng thông tin tương ứng. Vấn đề duy nhất là tôi gặp phải một số vấn đề nhỏ và như
Timothy Williams

giật nhẹ khi người chơi đi qua. Ý tưởng này bạn đưa ra âm thanh khá hứa hẹn. Vì vậy, về cơ bản những gì tôi cần làm là tính toán đường dọc theo màn hình mà camera gần mặt phẳng và mặt phẳng cổng giao nhau, hướng cho tôi hướng của đường đang đi và điểm là các điểm khác nhau của đường. Sau đó, làm thế nào để tôi xác định trong một shader / script ở phía nào của đường phân chia một pixel nằm trên?
Timothy Williams

Tôi đã cập nhật câu trả lời một chút để đưa ra một số mã cơ bản. Đảm bảo thử thay đổi chế độ xem gần cắt khoảng cách mặt phẳng để xác nhận sự cố. Làm điều này nhỏ nhất có thể cũng có thể đủ. Hãy nhớ rằng, làm cho nó hoạt động, làm cho nó hoạt động đúng, sau đó làm cho nó hoạt động nhanh chóng.
OriginalDaemon


Tôi đã thử nghiệm thay đổi khoảng cách gần mặt phẳng cắt, nó làm cho vấn đề tốt hơn một chút, nhưng như bài viết Mell đăng đã nói rằng nó không khắc phục được vấn đề khi lướt qua. Tôi vẫn cảm thấy như đường giao nhau có thể hoạt động, vì vậy tôi sẽ thử. Tôi cũng sẽ xem xét thêm một chút về bài viết mà Mell đã đăng. Cuối cùng, vấn đề là mặt nạ sâu sẽ nhanh hơn hay đường giao nhau này nhanh hơn
Timothy Williams

3

Các câu trả lời được đề xuất là rất tốt, nhưng cuối cùng tôi đã tìm kiếm một kỹ thuật khác bằng cách sử dụng mặt nạ chuyên sâu.

Những gì bạn làm là lấy cái này tập lệnh và trình đổ bóng, bạn đặt tập lệnh lên mọi đối tượng bằng trình kết xuất trong cảnh của bạn và đặt hàng đợi kết xuất thành 3020 (Tôi sẽ đăng một tập lệnh để dễ dàng hơn sau này).

Sau đó, bạn tạo một hộp các mặt phẳng (tất cả hướng vào trong, trong hình bạn không thể nhìn thấy cạnh của hộp gần bạn nhất, nhưng khi bạn ở trong hộp, tất cả những gì bạn sẽ thấy là màu xám) phía sau CẢ HAI cổng của bạn như vậy: nhập mô tả hình ảnh ở đây Và đặt chúng vào một lớp đặc biệt của riêng chúng (tôi đã chọn "DepthMask" cho tôi), sau đó bạn thêm một vật liệu có đổ bóng ở trên cho chúng. nhập mô tả hình ảnh ở đây

Sau đó, bạn lấy máy ảnh chính và bỏ chọn lớp đặc biệt của bạn khỏi mặt nạ loại bỏ (tôi đã bỏ chọn lớp DepthMask) và đặt độ sâu của nó thành 0. nhập mô tả hình ảnh ở đây

Sau đó, khi bạn dịch chuyển tức thời và sao chép máy ảnh, đặt cờ rõ ràng của máy ảnh khác thành "Chỉ độ sâu" và độ sâu của nó là 1. nhập mô tả hình ảnh ở đây

Sau đó, bạn có được một màn hình liền mạch pha trộn giữa hai chế độ xem camera.

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.