Làm thế nào để bạn lập trình tạo ra một hình cầu?


25

Ai đó có thể vui lòng giải thích làm thế nào có thể tạo ra một đỉnh hình cầu, chỉ số và tọa độ kết cấu? Có một sự thiếu sót đáng ngạc nhiên về tài liệu về cách làm như vậy và đó là điều mà tôi quan tâm đến việc học.

Tôi đã thử sự rõ ràng, googling, tìm kiếm trên gamedev.net, v.v. Tuy nhiên, không có gì bao gồm các thế hệ của các điểm hình cầu, lập chỉ mục cho chúng và kết cấu.


6
Tôi sẽ không downvote hoặc bỏ phiếu để đóng cái này, nhưng bạn có thực sự nói với tôi rằng không một kết quả nào từ google.com/search?q=how+to+generate+a+sphere+vertices có hữu ích không? Nếu đó là trường hợp bạn sẽ cần phải giải thích vấn đề của bạn chi tiết hơn.


Tìm kiếm tầng điện ly. Thông minh hơn nhiều so với "quả cầu cực" câm tạo ra những khuôn mặt vô dụng.
Notabene

3
Đáng chú ý, đối với một số mục đích đơn giản, một "hình cầu" hoàn toàn tốt là một hình tứ giác với kết cấu hình tròn đối diện với máy ảnh.
aaaaaaaaaaaa

Đây là cách tôi triển khai nó cho skydome trong trò chơi của mình.
danijar

Câu trả lời:


36

Có hai cách tiếp cận chung:

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

Phần ngoài cùng bên trái được gọi là hình cầu uv và phần ngoài cùng bên phải là một tầng điện ly.

GLUT có xu hướng sử dụng phương pháp uv: nhìn vào chức năng glutSolidSphere()trong mã nguồn tự do .

Đây là một bài viết tuyệt vời về sản xuất một icosphere: http://blog.andreaskahler.com/2009/06/creating-icosphere-mesh-in-code.html

Quả cầu uv trông giống như một quả địa cầu. Đối với nhiều mục đích, nó hoàn toàn tốt, nhưng đối với một số trường hợp sử dụng, ví dụ nếu bạn muốn làm biến dạng hình cầu, điều bất lợi là mật độ của các đỉnh lớn hơn xung quanh các cực. Ở đây, tầng điện ly tốt hơn, các đỉnh của nó được phân bố đều.

Bạn cũng có thể thấy điều này thú vị: http://kiwi.atmos.colostate.edu/BUGS/geodesic/text.html nó mô tả một cách tiếp cận để tổ chức các khuôn mặt thành các khu vực.

http://vterrain.org/Textures/spherical.html cung cấp một mô tả tuyệt vời về cách bạn có thể chọn để kết cấu chúng.


2
Mặc dù ý tưởng chung là tốt, việc phân chia một đa giác Schläfli {3,5} không phải là cách duy nhất để thực hiện nó. Nói chung, tôi thích làm việc với gia đình Schläfli {4, *} ({4,3} trong trường hợp hình cầu) cho mục đích lập bản đồ UV.
Martin Sojka

Các quả cầu icosah thờ được tessellated tinh xảo đắt hơn một chút để tạo ra vì cần phải phân chia đệ quy các khuôn mặt.
bobobobo

9

Có 2 cách để làm điều đó:

  1. Đi bộ theta và phi trong tọa độ hình cầu, tạo khuôn mặt và tris

  2. Tạo một khối hình chữ nhật và các mặt phân chia đệ quy cho đến khi đạt được điều kiện mong muốn.

Hình cầu sử dụng tọa độ hình cầu đi bộ

Đối với cách đầu tiên, bạn chỉ cần sử dụng một đôi lồng nhau để đi bộ theta và phi. Khi bạn đi bộ theta và phi, bạn quay hình tam giác để tạo hình cầu của bạn.

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

Mã mà nó sẽ trông giống như thế này:

for( int t = 0 ; t < stacks ; t++ ) // stacks are ELEVATION so they count theta
{
  real theta1 = ( (real)(t)/stacks )*PI ;
  real theta2 = ( (real)(t+1)/stacks )*PI ;

  for( int p = 0 ; p < slices ; p++ ) // slices are ORANGE SLICES so the count azimuth
  {
    real phi1 = ( (real)(p)/slices )*2*PI ; // azimuth goes around 0 .. 2*PI
    real phi2 = ( (real)(p+1)/slices )*2*PI ;

    //phi2   phi1
    // |      |
    // 2------1 -- theta1
    // |\ _   |
    // |    \ |
    // 3------4 -- theta2
    //

    //vertex1 = vertex on a sphere of radius r at spherical coords theta1, phi1
    //vertex2 = vertex on a sphere of radius r at spherical coords theta1, phi2
    //vertex3 = vertex on a sphere of radius r at spherical coords theta2, phi2
    //vertex4 = vertex on a sphere of radius r at spherical coords theta2, phi1

    // facing out
    if( t == 0 ) // top cap
      mesh->addTri( vertex1, vertex3, vertex4 ) ; //t1p1, t2p2, t2p1
    else if( t + 1 == stacks ) //end cap
      mesh->addTri( vertex3, vertex1, vertex2 ) ; //t2p2, t1p1, t1p2
    else
    {
      // body, facing OUT:
      mesh->addTri( vertex1, vertex2, vertex4 ) ;
      mesh->addTri( vertex2, vertex3, vertex4 ) ;
    }
  }
}

Vì vậy, lưu ý ở trên, điều quan trọng là phải quấn nắp trên và nắp dưới chỉ sử dụng tris, không phải quads.

Quả cầu Icosah thờ

Để sử dụng một icosahedron, bạn chỉ cần tạo các điểm của icosahedron và sau đó cuộn các hình tam giác từ nó. Các đỉnh của một khối hình chữ nhật ngồi ở gốc tọa độ là:

(0, ±1, ±φ)
1, ±φ, 0)
(±φ, 0, ±1)
where φ = (1 + 5) / 2 

Sau đó, bạn chỉ cần nhìn vào một sơ đồ của một khối nhựa và mặt gió từ những câu đó. Tôi đã có mã mà làm điều đó ở đây .


Bất kỳ ý tưởng làm thế nào để có được một nửa cơ thể, như từ theta = pi / 4 đến theta = 3pi * 4? Giống như hình ảnh này: i.stack.imgur.com/Jjx2c.jpg Tôi đã dành nhiều ngày cho việc này không thể giải quyết nó.
Tina J

3

Nếu các điểm không phải là đồng nhất cục bộ, nhưng phải đồng nhất toàn cầu và không phải tuân theo bất kỳ mẫu thiết lập nào, bạn có thể sử dụng một biến thể của thuật toán ném phi tiêu để phân phối n điểm trên một quả cầu có bán kính r , bình quân quận điểm ngoài. Những giá trị này đại khái là:

  1. Nếu bạn muốn có một số đỉnh cụ thể:
    • n = (lượng đỉnh mong muốn)
    • dist = 2 × r × √ ( π / n )
  2. Nếu bạn muốn có một khoảng cách trung bình cụ thể giữa các đỉnh:
    • n = 4 × π × ( r / dist ) 2
    • dist = (khoảng cách trung bình mong muốn)

Trong trường hợp đơn giản nhất, sau đó bạn có thể chọn ngẫu nhiên các điểm một cách ngẫu nhiên bằng cách chọn hai biến phân bố đồng nhất uv từ (0, 1) và tính tọa độ cực từ chúng theo các công thức θ = 2 × π × uϕ = arc cos (2 × v - 1); sau đó loại bỏ bất kỳ điểm nào nằm quá gần các điểm đã chọn. Đối với thuật toán phức tạp hơn và hoạt động tốt hơn đáng kể, hãy xem " Ném phi tiêu trên bề mặt " của Cline, Jeschke, White, Razdan và Wonka.

Sau khi bạn chọn bốn điểm đầu tiên của mình (giả sử không có ba điểm nào bị thoái hóa , nghĩa là - chúng không nằm trên cùng một vòng tròn lớn, nhưng điều đó rất khó xảy ra), bạn có thể tạo bốn khuôn mặt giữa chúng và mỗi lần bạn thêm một Điểm mới, bạn có thể chia khuôn mặt mà nó thuộc về ba khuôn mặt phụ.

Đối với mục đích kết cấu, sau đó bạn có thể ánh xạ các điểm vào bản đồ khối.

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.