Làm thế nào để ảo tưởng về thế giới tròn?


7

Tôi muốn tạo một thế giới phẳng, nhưng tôi muốn chia nó thành các phần sẽ tải theo phân đoạn (để tối ưu hóa tốt hơn) và khi bạn ở cuối bản đồ, nó sẽ bắt đầu tải lại các phân đoạn từ đầu. Và tôi muốn tạo ảo giác về độ tròn (chỉ có hiệu ứng quang học nếu có thể). Ví dụ, khi bạn xem tàu ​​trên đường chân trời, bạn sẽ thấy cột buồm của họ trước tiên.

Tôi chỉ hỏi ý tưởng lý thuyết, vì vậy bạn không cần gửi bất kỳ tập lệnh nào.


1
Một cái gì đó như youtube.com/watch?v=_kY4v-L3rvY ? Sử dụng shader để trình bày một môi trường phẳng như cong.
fadden

Có một trò chơi cũ mà tôi sử dụng để chơi có tên là Popious 3 có thế giới tròn. Họ sẽ xếp một bản đồ hình chữ nhật trên khắp thế giới để các đỉnh và các cạnh của hình chữ nhật sẽ kết nối với nhau (mặc dù không thể quấn một hình chữ nhật xung quanh một hình cầu theo cách này). Đó là một ảo ảnh rất thông minh và họ đã kéo nó đi rất tốt.
JSideris

Cảm ơn, nhưng đối với tôi là tùy chọn tốt hơn shader đỉnh.
T. Růžička

Câu trả lời:


10

Bạn có thể làm điều này hoàn toàn trong một shader đỉnh. Bạn muốn áp dụng trình đổ bóng này cho mọi thứ bạn kết xuất.

Một mẹo nhỏ mà bạn có thể làm là cân nó sao cho các vật thể gần đó nằm thẳng ra để nói 100 mét. Tôi khuyên bạn nên điều này bởi vì trong một trò chơi FPS, sự biến dạng trên các vật thể đòi hỏi bạn phải thay đổi mọi thứ. (Người chơi sẽ nhắm vào những thứ sai). Nếu bạn giữ cho các vùng lân cận bằng phẳng thì bắt đầu đường cong ở khoảng cách nó sẽ trông giống nhau mà không gặp vấn đề tương tác.

Đây là một hình ảnh để hiểu. (Tôi không có mã tại thời điểm này trên máy này, nhưng đó chỉ là một vài dòng nếu tôi nhớ chính xác).

nhập mô tả hình ảnh ở đây

Vì bạn đã yêu cầu mã. Tôi không thể kiểm tra mã này 100%, nhưng tôi đã thấy hình ảnh của nó hoạt động. (Tôi đã viết mã giả cho một người bạn đã chuyển đổi nó thành HLSL và các hình ảnh cho thấy nó hoạt động).

cbuffer matrix_buffer
{
  matrix world;
  matrix view;
  matrix projection;
};

struct vertex_input_type
{
  float4 position : POSITION;
  float3 normal : NORMAL;
};

struct pixel_input_type
{
  float4 position : SV_POSITION;
  float3 normal : NORMAL;
};

pixel_input_type vertex_shader(vertex_input_type input)
{
  pixel_input_type output;

  input.position.w = 1.0f;

#if 0
  output.position = mul(world, input.position);
  output.position = mul(view, output.position);
  output.position = mul(projection, output.position);
#else
  float4 viewPosition = float4(0, 20.0, 0, 1);
  float seaLevel = 0.0;
  float4 vertex = input.position;
  matrix model = world;
  float radius = 900.0;

  vertex = mul(model, vertex);
  float2 diff = vertex.xz - viewPosition.xz;
  float angleX = -length(diff) / radius;
  float angleY = atan2(diff.x, diff.y);
  float3x3 rotateX =
  {
    1, 0, 0,
    0, cos(angleX), -sin(angleX),
    0, sin(angleX), cos(angleX)
  };
  float3x3 rotateY =
  {
    cos(angleY), 0, sin(angleY),
    0, 1, 0,
    -sin(angleY), 0, cos(angleY)
  };
  vertex = float4(mul(rotateY, mul(rotateX, float3(0, radius + vertex.y - seaLevel, 0))) + float3(0, -radius, 0), 1);
  vertex = mul(projection, mul(view, vertex));
  output.position = vertex;
#endif

  output.normal = input.normal;

  return output;
}

Cảm ơn rất nhiều. Nó được gọi bằng cách nào đó? Vì vậy, tôi có thể tự tìm mã.
T. Růžička

Sẽ là một vài giờ cho đến khi tôi về nhà. Trong lúc này đây là một hình ảnh khác: i.imgur.com/RKzQifZ.png Ảnh này hiển thị các vùng yêu cầu tải dựa trên chiều cao tối đa mà máy ảnh có thể đạt được. Ngoài ra en.wikipedia.org/wiki/Tangent_lines_to_circles
Sirisian

@ T.Růžička Tôi đã cập nhật với mẫu mã duy nhất tôi có trong các ghi chú cũ. Tôi hy vọng nó sẽ giúp.
Sirisian

Thaks, nó đã giúp
T. Růžička

Bạn có biết làm thế nào để sử dụng nó trong Unity không?
T. Růžička
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.