2011-12-11 52 views
5

Cách phát hiện va chạm trong webgl, mà không sử dụng bất kỳ thư viện nào như three.js?Cách phát hiện va chạm trong webgl?

+1

Điều này có thể khó thực hiện. Dù sao, tại sao bạn không muốn một thư viện cho mình? –

+0

Tôi cũng chống thư viện – ajax333221

+1

@ ajax333221 Thư viện giúp cuộc sống của chúng ta dễ dàng hơn nhiều.:) –

Trả lời

13

Làm thế nào để phát hiện va chạm trong webgl

Bạn không có. WebGL, như OpenGL chỉ dành cho các công cụ vẽ. Nó không quản lý một cảnh, nó không có khái niệm "đối tượng" hoặc những thứ cấp cao như va chạm. Đó là tất cả về điểm, đường nét, hình tam giác và bóng đổ.

Mọi nội dung liên quan đến quản lý cảnh hoặc xung đột nằm ngoài phạm vi của WebGL (và OpenGL).

+0

thì làm thế nào tôi có thể tính toán nó trong js? –

+3

@DannyFox: Giống như cách bạn muốn tính toán bằng bất kỳ ngôn ngữ nào khác: Bằng cách giải các phương trình kiểm tra giao nhau hình học khác nhau và trích xuất các va chạm từ kết quả. Có một cuốn sách tuyệt vời về chủ đề: http://realtimecollisiondetection.net/ – datenwolf

+0

Bạn chắc chắn có thể giải quyết va chạm với OpenGL (và có thể là WebGL) bằng cách sử dụng trình đổ bóng. Cung cấp cho các đối tượng màu sắc khác nhau và sau đó kết hợp cả hai bằng cách sử dụng pha trộn. Nếu có một hoặc nhiều pixel trên hình ảnh kết quả là một màu khác với hai đối tượng (ví dụ: một số pixel từ đối tượng được pha trộn với các pixel đối tượng khác), có một xung đột. – Willem

3

Cách tiếp cận đơn giản là phát hiện xung đột tia trên GPU. Kiểm tra bài đăng trên blog sau về chủ đề.

http://blog.xeolabs.com/ray-picking-in-scenejs

Ý tưởng chính là để render hiện trường để một kết cấu (sử dụng một FBO) sử dụng một Shader mà tiết kiệm id đối tượng thay vì màu. Sau đó, bạn có thể nhanh chóng thực hiện tra cứu kết cấu này để xem tia nào va chạm với nhau.

+0

Điều này chỉ hoạt động để kiểm tra các tia phát ra từ điểm nhìn hoặc với hình học không bị che khuất. – datenwolf

+0

Có, giải pháp chỉ hoạt động với xung đột tia, nhưng câu hỏi không nêu rõ loại phát hiện xung đột nào là cần thiết. Điểm của tôi là một vài thử nghiệm va chạm có thể chạy hoàn toàn tốt trên GPU (nhưng nó không phải là một giải pháp chung) – Mortennobel

+0

cảm ơn, nhưng nó nằm trong scene.js. Tôi muốn làm điều đó mà không cần bất kỳ thư viện nào –

1

Kể từ chủ nhật, tôi đang cố giải quyết cùng một vấn đề. Mặc dù có nhiều thông tin trong www, tôi không thể làm cho nó hoạt động trên chương trình ví dụ của tôi. Ngay sau khi tôi giải quyết nó, tôi sẽ đăng ví dụ của tôi ở đây.

Lần thử cuối cùng của tôi là sử dụng cổng glu-unProject cho webGL. Cái này cần các thông số sau:

function (winx, có mùi rượu, winZ, mô hình, Proj, xem, objPos)

Tôi đã cố gắng để gọi chức năng này trực tiếp từ chức năng cảnh vẽ của tôi cho mục đích thử nghiệm.

var pMatrix = new mat4.ortho(iL, iR, iB, iT, fNearZ, farZ); 
var mvMatrix = new mat4.create(); 

mat4.identity(mvMatrix); 
mat4.translate(mvMatrix,[0,0,-40]); 

var oMouseMatrix = mat4.create(); 
mat4.identity(oMouseMatrix); 

//Rotate eye :-S 
mat4.rotate(oMouseMatrix,((this.fAnimationXAngle/10) * Math.PI)/360.0,[0,1,0]); 
mat4.rotate(oMouseMatrix,((this.fAnimationYAngle/10) * Math.PI)/360.0,[1,0,0]); 

mat4.multiply(oMouseMatrix, mvMatrix, mvMatrix); 

//Rotate model 
mat4.rotateX(mvMatrix,this.fRotX * Math.PI/180.0); 
mat4.rotateY(mvMatrix,this.fRotY * Math.PI/180.0); 
mat4.rotateZ(mvMatrix,this.fRotZ * Math.PI/180.0); 



var aTest = this.unProject(
    this.pLastMouse.x, 
    this.pLastMouse.y, 
    0, 
    mvMatrix, 
    pMatrix, 
    [0,0,this.iWidth,this.iHeight] 
); 

this.iWidth & this.iHeight là vải và khung nhìn rộng/chiều cao - this.pLastMouse.x & .y là chuột tọa độ bên trong vải

zI.debug(aTest); 

Nhưng kết quả là hoàn toàn crap. Tôi đoán có một số lỗi trong mã của tôi. Tôi đã bắt đầu chơi với WebGL vào thứ sáu tuần trước. Tôi không muốn từ bỏ điều đó sớm, nhưng tôi đã giải quyết được nhiều vấn đề từ đó, nhưng điều này khiến tôi phát điên.

Trong openGL nó dễ dàng hơn nhiều với tôi.

+0

cảm ơn, tôi sẽ dùng thử –

1

Tôi muốn giới thiệu trang web sau (tiếc là chỉ có sẵn bằng tiếng Đức) http://www.peter-strohm.de/webgl/webgltutorial8.php

Chúng tôi đã có thể thực hiện phát hiện va chạm và thậm chí có thể thực hiện cuộc gọi API trên một máy chủ sử dụng bản đồ id (ví dụ như chương trình tooltips với thêm thông tin cho một đối tượng nhất định trong cảnh).

Tôi hy vọng điều này sẽ giúp ích một chút.

Các vấn đề liên quan