2015-03-02 57 views
2

有沒有人有解釋爲什麼下面的交互式多維數據集不能在視網膜顯示mac上工作?three.js javascript/raycasting代碼不兼容視網膜顯示mac

http://mrdoob.github.io/three.js/examples/canvas_interactive_cubes.html

代碼工作在Firefox,Safari和Chrome在非視網膜的MacBook,但與視網膜顯示的Mac電腦無法正常工作。

Mac電腦:MacBook Pro的Retina顯示屏,iMac的視網膜顯示器,MacBook Pro的2011(無視網膜顯示),所有正在運行的優山美地

瀏覽器版本:火狐36,Safari瀏覽器版本8.0.3(10600.3.18),Chrome的版本40.0 .2214.115(64位)

+0

不[本three.js所演示](http://threejs.org/examples /canvas_interactive_particles.html)的工作?如果是這樣,我預計這是一個設備像素比問題。 – WestLangley 2015-03-03 00:41:20

+0

該演示適用於舊的mac。 – 2015-03-03 04:05:46

+0

我連接的演示程序是否可以在帶有視網膜顯示器的Mac上工作? – WestLangley 2015-03-03 04:17:51

回答

3

renderer.setSize()中,渲染器的domElement或canvas,按比例縮放像素比例。

renderer.setPixelRatio(window.devicePixelRatio); 
renderer.setSize(window.innerWidth, window.innerHeight); 
container.appendChild(renderer.domElement); 

然後,在interactive cubes example,歸一化的鼠標座標設置如下所示:

mouse.x = (event.clientX/renderer.domElement.width) * 2 - 1; 
mouse.y = - (event.clientY/renderer.domElement.height) * 2 + 1; 

這將導致一個問題與具有像素比不等於1

設備請注意,在interactive particles example中,標準化的鼠標座標計算方式不同,並且沒有問題。

mouse.x = (event.clientX/window.innerWidth) * 2 - 1; 
mouse.y = - (event.clientY/window.innerHeight) * 2 + 1; 

作爲解決方法,使用第二種模式。

我們可能不得不重新討論在未來版本的庫中如何處理設備像素比例。

編輯:@mrdoob提出了以下模式作爲溶液:

mouse.x = (event.clientX/renderer.domElement.clientWidth) * 2 - 1; 
mouse.y = - (event.clientY/renderer.domElement.clientHeight) * 2 + 1; 

three.js所R.70

+0

請注意,由於某種原因,clientWidth/Height將觸發[重排](https://gist.github.com/paulirish/5d52fb081b3570c81e3a)。一個可選的方法是緩存寬度和高度,只更新resize/scroll('getBoundingClientRect()'也可以與元素一起使用,但也會導致重排: - /)。 – K3N 2017-12-01 14:54:52