three.js - 使用正交相机时有没有办法防止剔除线条?

标签 three.js

使用正交相机时,当圆成一定角度时,我看不到圆的背面。

enter image description here

就好像圆被视为一个圆盘,其表面挡住了我期望看到圆的位置的视野。有没有办法使用正交相机但根本不进行任何剔除或至少不对这个圆进行任何剔除?

旋转一下这个例子来看看我在说什么:

// ------------------------------------------------
// BASIC SETUP
// ------------------------------------------------

// hard code canvas dimensions
const scale = 2;
const canvasHeight = 350 * scale;
const canvasWidth = 350 * scale;

// Create an empty scene
var scene = new THREE.Scene();

// Create a basic perspective camera
//var camera = new THREE.PerspectiveCamera( 75, canvasWidth/canvasHeight, 0.1, 1000 );
var camera = new THREE.OrthographicCamera( canvasWidth / - 2, canvasWidth / 2, canvasHeight / 2, canvasHeight / - 2, 1, 1000 );
camera.position.z = 4;

// Create a renderer with Antialiasing
var renderer = new THREE.WebGLRenderer({antialias:true});

// Configure renderer clear color
renderer.setClearColor("#C3C3C3");

// Configure renderer size
renderer.setSize(canvasWidth, canvasHeight);

// Append Renderer to DOM
document.body.appendChild( renderer.domElement );

var controls = new THREE.OrbitControls( camera, renderer.domElement );
controls.update();
setTimeout(function() {
  controls.reset();
}, 5000)

// ------------------------------------------------
// FUN STARTS HERE
// ------------------------------------------------

// Render Loop
var render = function () {
  requestAnimationFrame( render );

  //cube.rotation.x += 0.01;
  //cube.rotation.y += 0.01;

  controls.update();

  // Render the scene
  renderer.render(scene, camera);

//  console.log(visibleWidthAtZDepth(camera,))
};
render();

function drawCircle()
{
    let radius   = canvasWidth / 2 - 5,
      segments = 64,
      material = new THREE.LineBasicMaterial( { color: 0x0000ff } ),
      geometry = new THREE.CircleGeometry( radius, segments );

    geometry.vertices.shift();

    scene.add( new THREE.LineLoop( geometry, material ) );
}
drawCircle();
<!DOCTYPE html>
<html>
<head>
    <meta name=viewport content="width=device-width,initial-scale=1">
    <meta charset="utf-8"/>
</head>
<body>
</body>
<style>
</style>
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/108/three.js"></script>
<script src="https://unpkg.com/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="d6a2bea4b3b396e6f8eee3f8e6" rel="noreferrer noopener nofollow">[email protected]</a>/examples/js/controls/OrbitControls.js"></script>
<script src="bolt-hole-calculator.js"></script>
</html>

最佳答案

将相机设置得离原点更远。您遇到了与近平面相交的圆,因为相机距离原点只有 4 个单位,而圆的半径远大于此。

// ------------------------------------------------
// BASIC SETUP
// ------------------------------------------------

// hard code canvas dimensions
const scale = 2;
const canvasHeight = 350 * scale;
const canvasWidth = 350 * scale;

// Create an empty scene
var scene = new THREE.Scene();

// Create a basic perspective camera
//var camera = new THREE.PerspectiveCamera( 75, canvasWidth/canvasHeight, 0.1, 1000 );
var camera = new THREE.OrthographicCamera(canvasWidth / -2, canvasWidth / 2, canvasHeight / 2, canvasHeight / -2, 1, 1000);
camera.position.z = 500;

// Create a renderer with Antialiasing
var renderer = new THREE.WebGLRenderer({
  antialias: true
});

// Configure renderer clear color
renderer.setClearColor("#C3C3C3");

// Configure renderer size
renderer.setSize(canvasWidth, canvasHeight);

// Append Renderer to DOM
document.body.appendChild(renderer.domElement);

var controls = new THREE.OrbitControls(camera, renderer.domElement);
controls.update();
setTimeout(function() {
  controls.reset();
}, 5000)

// ------------------------------------------------
// FUN STARTS HERE
// ------------------------------------------------

// Render Loop
var render = function() {
  requestAnimationFrame(render);

  //cube.rotation.x += 0.01;
  //cube.rotation.y += 0.01;

  controls.update();

  // Render the scene
  renderer.render(scene, camera);

  //  console.log(visibleWidthAtZDepth(camera,))
};
render();

function drawCircle() {
  let radius = canvasWidth / 2 - 5,
    segments = 64,
    material = new THREE.LineBasicMaterial({
      color: 0x0000ff
    }),
    geometry = new THREE.CircleGeometry(radius, segments);

  geometry.vertices.shift();

  scene.add(new THREE.LineLoop(geometry, material));
}
drawCircle();

// Do a rotate on this example to see what I 'm saying:
<!DOCTYPE html>
<html>

<head>
  <meta name=viewport content="width=device-width,initial-scale=1">
  <meta charset="utf-8" />
</head>

<body>
</body>
<style>

</style>
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/108/three.js"></script>
<script src="https://unpkg.com/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="98ecf0eafdfdd8a8b6a0adb6a8" rel="noreferrer noopener nofollow">[email protected]</a>/examples/js/controls/OrbitControls.js"></script>
<script src="bolt-hole-calculator.js"></script>

</html>

关于three.js - 使用正交相机时有没有办法防止剔除线条?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58103261/

相关文章:

javascript - Three.js中如何把 `object1`改成 `object2`添加?

three.js - 如何在沿 z 轴的某个高度创建 PlaneGeometry 对象?

javascript - Three.js - 对象跟随鼠标位置

javascript - 基于四元数处理炮身的正确旋转?

javascript - raycaster 是否应该始终位于 render() 函数中?

javascript - three.js - 将相机旋转链接到 div 内的移动设备移动

javascript - 如何使用 Three.js 为不同的对象设置动画

javascript - Three.js,appendChild 和返回

reactjs - React 中的 Webpack 无法加载带有 GLTF 扩展的 3D 模型,显示 404 not found

javascript - Three.js - 第一个子级跳跃并采用父级变换