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图形固定渲染管线
图形渲染管道被认为是实时图形渲染的核心,简称为管道.管道的主要功能是由给定的虚拟摄像机.三维物体.灯源.光照模型.纹理贴图或其他来产生或渲染一个二维图像.由此可见,渲染管线是实时渲染技术的底层工具.图 ...
随机推荐
- SQL优化的若干原则
SQL语句:是对数据库(数据)进行操作的惟一途径:消耗了70%~90%的数据库资源:独立于程序设计逻辑,相对于对程序源代码的优化,对SQL语句的优化在时间成本和风险上的代价都很低:可以有不同的写法:易 ...
- sphinx 安装使用
一.linux(centos)下安装源码包 1.下载 wget http://sphinxsearch.com/files/sphinx-2.3.1-beta.tar.gz 2.安装 切换目录到 ...
- jQuery实现输入框提示,当获取焦点时提示消失,当失去焦点时内容为空则显示提示,否则保留输入信息
首先看效果 默认状态下 获取焦点状态下 什么也没输入,离开 有输入离开 输入默认值离开 代码 <!DOCTYPE html> <html> <head> <m ...
- HTTP-API-DESIGN 怎样设计一个合理的 HTTP API (二)
接上篇 HTTP-API-DESIGN 怎样设计一个合理的 HTTP API (一) 整个 ppt 可以去这里下载. 这一篇主要从服务端应该如何返回合理的返回值的角度,讨论如何设计一个合理的 HTTP ...
- 机器学习 delay learning
计蒜之道总决赛考了机器学习,大多数人都不会所以现场学,然后我看了一些之后放弃了..采取了人力分析的办法,最后果然被学习能力碾压.. 不过机器学习看起来是很有趣的,也听别人说了很多,和别人聊了一些,如果 ...
- jmeter随笔
1. ${__time(yyyy-MM-dd HH:mm:ss,)} 2. import use.GetRsaContent; String pfxPath = "pfx";Str ...
- 用if写一个备份mysql的脚本
#!/bin/bash # 备份数据库 BAK_DIR=/data/backup/`date +%Y%m%d` MYSQLDB=dexin MYSQLUSER=root MYSQLPW=123456 ...
- Location对象常用知识
产品终于上线,后期主要是优化了.在开发过程中用到了很多location对象的知识,趁现在有时间先整理一下. Location 对象存储在 Window 对象的 Location 属性中,可通过wind ...
- Daper返回DataTable
using (IDbConnection conn = OpenConnection()) { string sql = "SELECT TOP 1 * FROM dbo.Students& ...
- 我的json
{ "firstName":[ "xMan" ], "members":[ { "name":"X教授&quo ...