threejs三角形Geometry的顶点时针顺序会导致三角形看不见
var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera(75,winSize.width/winSize.height,0.1,1000);
var renderer = new THREE.WebGLRenderer();
renderer.setSize(winSize.width,winSize.height);
document.body.appendChild(renderer.domElement);
camera.position.x = -30;
camera.position.y = 30;
camera.position.z = 40;
camera.up.set(0,1,0);
camera.lookAt(new THREE.Vector3(0,0,0));
var p1 = new THREE.Vector3(0,10,20);
var p2 = new THREE.Vector3(0,30,20);
var p3 = new THREE.Vector3(0,25,40);
var triangleGeometry = new THREE.Geometry();
triangleGeometry.vertices.push(p1,p2,p3);
//3个点投射到camera也就是2d屏幕平面上的时候,在2d平面上这3个点的时针顺序,顺时针如果看不见,就改成逆时针
triangleGeometry.faces.push(new THREE.Face3(1,0,2));
// triangleGeometry.faces.push(new THREE.Face3(0,1,2));
var triangle = new THREE.Mesh(triangleGeometry,
new THREE.MeshBasicMaterial({ color: 0xff00ff }));
scene.add(triangle);
会出现的问题就是,某种情况下,会看不见这个三角形,但是如果把THREE.Geometry对象的vertices数组参数或者faces数组参数里的元素顺序改变一下,三角形就出来了;
出现这种情况的原因,国外帖子的解释是说跟法线的方向有关系,如果顺序按照顺时针顺序,则曲面的法向量将向下指向,并且由于相机从上面看,所以会看不到三角形,如果顺序是逆时针的,法向量会指向你的相机,就看到三角形了,总是就是要想办法让法向量指向你的摄像机;
解决问题的一个思路,目前个人理解vertices数组里3个点的顺序,不是问题的关键,关键是在这3个点在faces数组里的顺序,上面代码中vertices数组里的元素的顺序是,p1,p2,p3, faces数组里的元素1,0,2,代表正确的绘图时的顺序是p2,p1,p3, 所以上面代码中,也可以改成这样:
triangleGeometry.vertices.push(p2,p1,p3);
triangleGeometry.faces.push(new THREE.Face3(0,1,2));
var triangle = new THREE.Mesh(triangleGeometry,
new THREE.MeshBasicMaterial({ color: 0xff00ff }));
scene.add(triangle);
既然有3个点的存在,不管在3d世界里是什么朝向,什么角度,投射到摄像机也就是2d屏幕上的时候,总是可以看成是一个2d平面上的3个点,
如果发现看不到这3个点组成的三角形,如果此时3个点是的指针方向是顺时针,就改成逆时针,反之如果是逆时针,就改成顺时针,就可以看到三角形了。
正式的3d项目中的模型,如果不带透明度的话,摄像机拍摄不到的模型背面的面,看不到就看不到了,本来不需要看到,但如果是带有透明度材质的模型,如果在模型本身角度偏转或者摄像机大角度围绕模型旋转而造成模型一个面上3个点的指针顺序发生了顺/逆的改变,那是不是就要实时的计算和改变个面的3个顶点的时针顺序。目前3d这快个人理解还很浅陋,希望以后有机会打自己脸。
参考:https://stackoverflow.com/questions/39398503/draw-a-basic-triangle-with-three-js?rq=1
============================================
opengl右手坐标系,所以是顶点顺序是逆时针的面才可以被看的见。
threejs三角形Geometry的顶点时针顺序会导致三角形看不见的更多相关文章
- 大一C语言学习笔记(11)---编程篇--写一个程序,可以获取从键盘上输入的的三个数,并能够判断是否可以以这三个数字作为边长来构成一个三角形,如果可以的话,输出此三角形的周长及面积,要求 0 bug;
考核内容: 写一个程序,可以获取从键盘上输入的的三个数,并能够判断是否可以以这三个数字作为边长来构成一个三角形,如果可以的话,输出此三角形的周长及面积: 答案: #include<stdio.h ...
- ThreeJS geometry的顶点世界坐标
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 由于link顺序错误导致的undefined reference
其实我之前就遇到过这个问题,也强调过,GNU-G++在link阶段是依赖输入的.o或者.a文件的顺序的.如果顺序错误会导致undefined reference错误 见这篇随笔:http://www. ...
- Union All 使用注意事项和字段顺序不一致导致的异常
使用注意,先说结果: UNION 操作符用于合并两个或多个 SELECT 语句的结果集,这里需要注意的是: UNION 内部的 SELECT 语句必须拥有相同数量的列: 列也必须拥有相似的数据类型(实 ...
- gcc参数-l传递顺序错误导致`undefined reference'的一点小结
刚才编译一个pthread的单文件程序, 使用的命令行是: gcc -o thread1 -lpthread thread1.c 结果报错: $ gcc -o thread1 -lpthread th ...
- java setVisible顺序不同导致窗体内容不显示问题
今天学习JAVA编写窗体的时候,先写了setVisible(true);然后才去创建的各种控件以及设置大小.位置等 结果运行后只显示空白的窗体,必须最小化再最大化或点击一下边框,才显示窗体内容(即必须 ...
- Directx11学习笔记【九】 【转】 3D渲染管线
原文地址:http://blog.csdn.net/bonchoix/article/details/8298116 3D图形学研究的基本内容,即给定场景的描述,包括各个物体的材质.纹理.坐标等,照相 ...
- Directx11学习笔记【九】 3D渲染管线
原文:Directx11学习笔记[九] 3D渲染管线 原文地址:http://blog.csdn.net/bonchoix/article/details/8298116 3D图形学研究的基本内容,即 ...
- 浅谈 GPU图形固定渲染管线
图形渲染管道被认为是实时图形渲染的核心,简称为管道.管道的主要功能是由给定的虚拟摄像机.三维物体.灯源.光照模型.纹理贴图或其他来产生或渲染一个二维图像.由此可见,渲染管线是实时渲染技术的底层工具.图 ...
随机推荐
- Elasticsearch之中文分词器
前提 什么是倒排索引? Elasticsearch之分词器的作用 Elasticsearch之分词器的工作流程 Elasticsearch之停用词 Elasticsearch的中文分词器 1.单字分词 ...
- spark SQL学习(案例-统计每日uv)
需求:统计每日uv package wujiadong_sparkSQL import org.apache.spark.sql.{Row, SQLContext} import org.apache ...
- 对spring boot 之AutoConfiguration 的理解
来自:http://rensanning.iteye.com/blog/2363467 https://blog.csdn.net/tincox/article/details/79186067 Au ...
- Asp.Net MVC向视图View传值的三种方法
本文将总结Asp.Net MVC向视图View传值的三种常见的方法: ----------------------------------------------------------------- ...
- Centos 解决 No package htop available.
yum install -y epel-release 之后就可以安装 yum install -y htop 什么是EPEL? EPEL的全称叫 Extra Packages for Enterpr ...
- thinkphp3.2笔记(1)目录,控制器及url模式,地址解析
一.目录 Application : tp默认的应用代码存储的目录 Public : Tp 默认的存储静态资源的目录,img,css,js ThinkPHP : Tp 框架的源代码 ...
- angular之自定义管道
1,装了angular2 的 cli之后,cmd中命令建立个管道文件 ng g p <name>; 如建一个在pipe文件中建一个add.pipe.ts文件 可以这么么写 ng g p p ...
- [oracle] DBLINK +同义词,实现本地数据库访问另一台机器的数据库
起因:订单表原来在90库上,后各种原因移到了40库上,需访问40库上的订单表.采用DBLINK+同义词方法: -- 1 在90机器上用GPSV4登录PLSQL,创建DBLINK,从本地数据库,连接到远 ...
- VMware虚拟机安装linux7并设置网络
1.下载VMware虚拟机 https://www.vmware.com/cn/products/workstation/workstation-evaluation.html 永久激活12位序列号: ...
- Slasher Flick
打不死的小强! 返回一个数组被截断n个元素后还剩余的元素,截断从索引0开始. 这是一些对你有帮助的资源: Array.slice() Array.splice() 按照提供的第一种方法,代码如下: f ...