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的顶点时针顺序会导致三角形看不见的更多相关文章

  1. 大一C语言学习笔记(11)---编程篇--写一个程序,可以获取从键盘上输入的的三个数,并能够判断是否可以以这三个数字作为边长来构成一个三角形,如果可以的话,输出此三角形的周长及面积,要求 0 bug;

    考核内容: 写一个程序,可以获取从键盘上输入的的三个数,并能够判断是否可以以这三个数字作为边长来构成一个三角形,如果可以的话,输出此三角形的周长及面积: 答案: #include<stdio.h ...

  2. ThreeJS geometry的顶点世界坐标

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. 由于link顺序错误导致的undefined reference

    其实我之前就遇到过这个问题,也强调过,GNU-G++在link阶段是依赖输入的.o或者.a文件的顺序的.如果顺序错误会导致undefined reference错误 见这篇随笔:http://www. ...

  4. Union All 使用注意事项和字段顺序不一致导致的异常

    使用注意,先说结果: UNION 操作符用于合并两个或多个 SELECT 语句的结果集,这里需要注意的是: UNION 内部的 SELECT 语句必须拥有相同数量的列: 列也必须拥有相似的数据类型(实 ...

  5. gcc参数-l传递顺序错误导致`undefined reference'的一点小结

    刚才编译一个pthread的单文件程序, 使用的命令行是: gcc -o thread1 -lpthread thread1.c 结果报错: $ gcc -o thread1 -lpthread th ...

  6. java setVisible顺序不同导致窗体内容不显示问题

    今天学习JAVA编写窗体的时候,先写了setVisible(true);然后才去创建的各种控件以及设置大小.位置等 结果运行后只显示空白的窗体,必须最小化再最大化或点击一下边框,才显示窗体内容(即必须 ...

  7. Directx11学习笔记【九】 【转】 3D渲染管线

    原文地址:http://blog.csdn.net/bonchoix/article/details/8298116 3D图形学研究的基本内容,即给定场景的描述,包括各个物体的材质.纹理.坐标等,照相 ...

  8. Directx11学习笔记【九】 3D渲染管线

    原文:Directx11学习笔记[九] 3D渲染管线 原文地址:http://blog.csdn.net/bonchoix/article/details/8298116 3D图形学研究的基本内容,即 ...

  9. 浅谈 GPU图形固定渲染管线

    图形渲染管道被认为是实时图形渲染的核心,简称为管道.管道的主要功能是由给定的虚拟摄像机.三维物体.灯源.光照模型.纹理贴图或其他来产生或渲染一个二维图像.由此可见,渲染管线是实时渲染技术的底层工具.图 ...

随机推荐

  1. 记数排序 & 桶排序 & 基数排序

    为什么要写这样滴一篇博客捏...因为一个新初一问了一道水题,结果就莫名其妙引起了战斗. 然后突然发现之前理解的桶排序并不是真正的桶排序,所以写一篇来区别下这三个十分相似的排序辣. 老年菜兔的觉醒!!! ...

  2. .net 修改AD域中的密码

    1.通过vs 2013 新建一个web站点(不是空项目),这个会带一下模板, 2.然后新建一个页面UpdatePassWord.aspx aspx页面内容: <%@ Page Title=&qu ...

  3. input输入框延时发送请求问题

    同样是面试遇到的问题,input输入框,怎么减少发送请求次数. 键盘抬起触发事件,首先清除定时器,再开启定时器.只要小于1s的连续输入,都会先把上一次定时器清除.停顿一秒后,开始执行请求事件(此处为c ...

  4. ThinkPHP开发笔记-控制器

    1.下面就是一个典型的控制器类的定义: <?php namespace Home\Controller; use Think\Controller; class IndexController ...

  5. ThinkPHP开发笔记-视图

    1.如果要在模板中输出变量,必须在在控制器中把变量传递给模板,系统提供了assign方法对模板变量赋值,无论何种变量类型都统一使用assign赋值,而且assign方法必须在display和show方 ...

  6. Mac 升级node与npm

    第一步,先查看本机node.js版本: node -v 第二步,清除node.js的cache: sudo npm cache clean -f 第三步,安装 n 工具,这个工具是专门用来管理node ...

  7. Centos7 安装Power Shell

    Centos7 安装Power Shell 1 查看版本 # cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core) 2 安装 # R ...

  8. 使用jquery.jqprint.js 实现的打印功能,IE9不能进行打印预览、火狐打印空白界面

    提示的内容:SCRIPT438: 对象不支持“ExecWB”属性或方法 首先解决IE9不能打印预览的问题: 查找了一大推资料 ,有两种说法:一种是IE的安全性级别太高:一种是需要安装什么   微软we ...

  9. Opentsdb简介(一)

    原文:http://www.jianshu.com/p/0bafd0168647 1.OpenTSDB介绍 1.1.OpenTSDB是什么?主要用途是什么? 官方文档这样描述:OpenTSDB is ...

  10. Hive 导入、导出数据

    <------ 导入 ------> 从本地目录文件导入Hive表 语法:LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABL ...