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. 爬虫之JSON

    数据提取之JSON与JsonPATH JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写.同时也方便了机器进行解析和生成.适 ...

  2. 【Network Architecture】Feature Pyramid Networks for Object Detection(FPN)论文解析(转)

    目录 0. 前言 1. 博客一 2.. 博客二 0. 前言   这篇论文提出了一种新的特征融合方式来解决多尺度问题, 感觉挺有创新性的, 如果需要与其他网络进行拼接,还是需要再回到原文看一下细节.这里 ...

  3. 【cs231n】神经网络学习笔记1

    神经网络推荐博客: 深度学习概述 神经网络基础之逻辑回归 神经网络基础之Python与向量化 浅层神经网络 深层神经网络 前言 首先声明,以下内容绝大部分转自知乎智能单元,他们将官方学习笔记进行了很专 ...

  4. webservice声明发布SOAP1.2

    在不声明1.2的情况下,默认是1.1 当声明1.2时

  5. (局部刷新)jquery.ajax提交并实现单个div刷新

    web开发中我们经常会遇到局部刷新页面的需求,以前我经常使用ajax和iframe实现局部刷新,后来做政府的项目,对页面的样式要求比较多,发现使用iframe控制样式什么的很麻烦,所以就采用了新的办法 ...

  6. angularJS基础入门

    所用到工具:<script src="//cdn.bootcss.com/angular.js/1.5.8/angular.min.js"></script> ...

  7. Linux命令详解-mkdir

    linux mkdir 命令用来创建指定的名称的目录,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录. 1.命令格式: mkdir [选项] 目录... 2.命令 ...

  8. jQuery-瀑布流的取巧做法分享

      分析:瀑布流,做法有2种 (1)绝对定位方案:每个单元格设置为绝对定位,通过计算,分别设置 top , left 即可实现 (2)浮动方案:弄N列布局(浮动),然后图片数据,按顺序依次插入,如N为 ...

  9. poj3308 Paratroopers 最大流 最小点权覆盖

    题意:有一个n*m的矩阵,告诉了在每一行或者每一列安装大炮的代价,每一个大炮可以瞬间消灭这一行或者这一列的所有敌人,然后告诉了敌人可能出现的L个坐标位置,问如何安置大炮,使花费最小.如果一个敌人位于第 ...

  10. RedHat/CentOS 7通过nmcli命令管理网络教程

    Red Hat Enterprise Linux 7 和CentOS 7 的网络管理实际上是对NetworkManager的管理,可通过nmcli命令进行控制,下面小编就给大家介绍下RedHat/Ce ...