射线的定义 在欧几里德几何中,射线的定义是:直线上一点和它一旁的部分.由此可知,射线有两个性质,一是只有一个端点,二是一端无限延伸. 射线的参数方程 其中p0是射线的起点, u是射线的方向向量,t >= 0,根据t的取值不同,可得射线上不同的点,所有这些点便构成了整个射线,如图 平面的定义 平面可以由法向量和平面内的一点来确定,因为过一点,有且只有一个平面与已知直线垂直 平面的参数方程 其中n是平面的法向量,p0是已知的平面内一点,符号●表示 点积,因n与平面垂直,所以n与平面内任意直线垂直, …
本文以Fast, Minimum Storage Ray Triangle Intersection为参考,在此感谢原作者,大家也可以直接阅读原版. 概述 射线和三角形的相交检测是游戏程序设计中一个常见的问题,最典型的应用就是拾取(Picking),本文介绍一个最常见的方法,这个方法也是DirectX中采用的方法,该方法速度快,而且存储空间少.先讲述理论,然后给出对应的代码实现.          理论部分 一个直观的方法 我想大多数人在看到这个问题时,可能都会想到一个简单而直观的方法:首先判断…
背景介绍(学习算法之前需要先了解) 射线与空间内三角形的相交检测是游戏程序设计中一个常见的问题,最典型的应用就是拾取(Picking),本文介绍一个最常见的方法,这个方法也是DirectX中采用的方法,该方法速度快,而且存储空间少.先讲述理论,然后文章末尾给出对应的代码实现与Unity中的显示. 简单而直观的方法是:先判断射线是否与三角形所在的平面相交,如果相交,再判断交点是否在三角形内.但这种方法效率并不高,因为多计算了三角形所在的平面. Möller-Trumbore射线三角相交算法是一种快…
引言 射线Ray,在3D图形学中有很多重要的应用.比如,pick操作就是使用射线Ray来实现的,还有诸如子弹射线的碰撞检测等等都可以使用射线Ray来完成.所以,在本次博客中,将会简单的像大家介绍下,如何进行Ray-Triangle的交叉检测. Ray-Triangle交叉检测算法 在Tomas Moller的MT97论文中,提出了一种新的算法.这种算法能够减少以前进行Ray-Triangle交叉检测所需要的内存消耗.在以前,进行Ray-Triangle交叉检测,主要是计算射线与三角形所构成的平面…
给定p1, p2, p3, p4四个点,p1,p2为一条线段,p3,p4为一条线段,检测其是否有交点. 可分为三种情况: 1. L2与x轴平行 2. L2与y轴平行 3. L2与坐标轴不平行. (L1与坐标轴平行,类似处理) 基本思路,求出交点坐标,并检测其是否在两个线段内即可. 检测代码: public static float min(float x, float y) { return x<y? x: y; } public static float max(float x, float…
简单的题意,要注意z2 = h2*0.9-r2 #include <iostream> #include <cmath> #include <vector> #include <string.h> #include <stdlib.h> #include <algorithm> using namespace std; #define MAX_N 110 /*------------------常量区-----------------…
3384 -- Feng Shui 构造半平面交,然后求凸包上最远点对. 这题的题意是给出一个凸多边形区域,要求在其中放置两个半径为r的圆(不能超出凸多边形区域),要求求出两个圆心,使得多边形中没有被覆盖的面积最小.反之就是求圆覆盖的区域最大.首先我们可以求出圆心放置的位置的区域,这个要利用半平面交,将原多边形区域向内收缩r的距离.要求两个圆覆盖的区域最大,也就是它们相交的面积最小,也就是两个圆心的距离要尽可能的大.这样就说明了,这题的做法是要求出凸包上面的最远点对. 做这题的时候犯了两个错误,…
3335 -- Rotating Scoreboard 给出一个多边形,要求判断它的内核是否存在. 还是半平面交的题,在这道题中,公告板允许其所在位置与直线共线也算是可见,于是我们就可以将每一条直线微小的移动,然后判断是够能够交出多边形,这样做是因为对于半平面交是不能直接判断是够交集是一个点的情况的. 代码如下: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm…
1279 -- Art Gallery 还是半平面交的问题,要求求出多边形中可以观察到多边形所有边的位置区域的面积.其实就是把每一条边看作有向直线然后套用半平面交.这题在输入的时候应该用多边形的有向面积来判断输入的顺序是顺时针的还是逆时针的. 对于半平面交问题,要注意最后半平面返回的是多少个点.对于小于3个点的情况应该直接返回结果,避免计算过程中产生错误. 代码如下: #include <cstdio> #include <cstring> #include <iostrea…
光线求交 光线定义:position \(a(t)\) = \(o\) + \(t\vec{d}\); 球定义: center p, radius r; 平面定义:normal \(\vec{n}\) , offset t; 三角形定义:position \(a_1\), \(a_2\), \(a_3\), normal \(\vec{n}\); 光线与球相交 (Ray/Sphere Intersection) c++代码 : bool HitTest(const Ray& ray, HitTe…
商域无疆 (http://blog.csdn.net/omni360/) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:商域无疆 -  本博客专注于 敏捷开发及移动和物联设备研究:数据可视化.GOLANG.Html5.WEBGL.THREE.JS,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 俺也是刚開始学,好多地儿肯定不正确还请见谅. 下面代码是THREE.JS 源代码文件里Math/Ray.js文件的凝视. 很多其它更新在 : https://githu…
Sprite3D Sprite3D works in many ways like a normal Sprite. Sprite3D is a three-dimensional model that includes the model, skeletal and rendering data needed to create the 3D Sprite. Sprite3D is derived from Node and therefore inherits most of Nodes f…
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十八章:立方体贴图 代码工程地址: https://github.com/jiabaodan/Direct12BookReadingNotes 学习目标 学习什么是立方体贴图,并且如何在HLSL中对它们采样: 如何使用DX的纹理工具创建立方体贴图: 学习如何用立方体贴图来模仿反射: 学习如何使用立方体贴图对球体采样来模拟一个天空和远处的山. 1 立方体纹理映射 在D…
前言 在DirectX SDK中,碰撞检测的相关函数位于xnacollision.h中.但是现在,前面所实现的相关函数都已经转移到Windows SDK的DirectXCollision.h中,并且处于名称空间DirectX内.这里面主要包含了四种包围盒(Bounding Volumes),并且是以类的形式实现的: BoundingSphere类--包围球(Bounding Box) BoundingBox类--轴对齐包围盒(Axis-aligned bounding box),又称AABB盒…
http://www.cppblog.com/lovedday/archive/2008/03/25/45334.html http://www.cppblog.com/lovedday/ D3D中的模板缓存(3) 8.3实例程序:平面阴影 在场景中被灯光照射的地方会产生阴影,这将使场景变的更真实.在这一部分我们将演示怎样实现平面阴影,即在平面上的阴影(如图8.5). 使用这种阴影只是一种权宜之计,虽然它增强了场景的真实效果,但是这并不是现实中的阴影. 为了实现平面阴影,我们首先必须找到物体投射…
前言 拾取是一项非常重要的技术,不论是电脑上用鼠标操作,还是手机的触屏操作,只要涉及到UI控件的选取则必然要用到该项技术.除此之外,一些类似魔兽争霸3.星际争霸2这样的3D即时战略游戏也需要通过拾取技术来选中角色. 给定在2D屏幕坐标系中由鼠标选中的一点,并且该点对应的正是3D场景中某一个对象表面的一点. 现在我们要做的,就是怎么判断我们选中了这个3D对象. 在阅读本章之前,先要了解下面的内容: 章节 05 键盘和鼠标输入 06 DirectXMath数学库 10 摄像机类 18 使用Direc…
1.左手坐标系与右手坐标系没有好坏之分,不同的研究领域和不同的背景下,选择不同的坐标系:传统计算机图形学采用“左手坐标系”,线性代数则倾向于使用右手坐标系 坐标系由坐标轴与坐标原点组成.原点定义坐标系的位置,轴定义了坐标系的方向. “世界坐标系”被广泛称为全局坐标系或者宇宙坐标系: “物体坐标系”被称为模型坐标系,或者“身体坐标系” “摄像机坐标系”,与观察者密切相关,摄像机坐标系与屏幕坐标系相似,区别是,摄像机坐标系在3D空间中,而屏幕坐标系在2D平面里. “摄像机坐标系”被认为是一种特殊的“…
  今天上午去实验室打算把项目从github上pull下来发现貌似不行,然后强行pull下来后项目变得乱七八糟了,有的组件都不知道去哪里了.去github上看了看发现上面day6和day7都没有,特别奇怪.没办法又得慢慢改,这git的问题贼烦人.   修改好后再commit给我弹了这么些东西:   去网上搜寻解决方案,都是些不知所云的东西,看得我头皮发麻.于是只好暴力重建仓库,也就是删除原有的,重建一个,clone下来,再把修改好的项目放到clone下来的文件夹里再push,终于没有这些烦人的红…
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十七章:拾取 代码工程地址: https://github.com/jiabaodan/Direct12BookReadingNotes 学习目标 学习如何实现拾取算法,我们将它分解为下面几个步骤: 当点击屏幕上s点时,计算对应的透视窗口上的点p: 在视景坐标系下计算拾取射线: 将射线和要进行检测的模型变换到同一个坐标系下: 检测模型是否和射线相交,取深度值最小的那…
参考文章 深入探索3D拾取技术 OpenGL 3D拾取 射线和三角形的相交检测(ray triangle intersection test) 3D拾取的方法有两种 1.基于几何计算的射线-三角形相交法 2.使用OpenGL本身的拾取机制 这里主要使用第二种,理解起来相对简单一点. 借用大佬的通俗易懂的说法,这种方法的本质就是: 把每个三角形的id作为材质渲染到屏幕上,很容易就能找到鼠标对应的颜色值.这样多少三角形都能正确得到. 完全不用进行数学计算. 优点在于减少了大量不必要的计算开销——只对…
关于魔方 魔方英文名字叫做Rubik's Cube,是由匈牙利建筑学教授和雕塑家Ernő Rubik于1974年发明,最初叫做Magic Cube(这大概也是中文名字的来历吧),1980年Ideal Toys公司开始销售此玩具,并将名字改为Rubik's Cube. 魔方在80年代最为风靡,至今未衰.截至2009年1月,魔方在全世界已经售出了3亿五千多万个.最常见的魔方是三阶魔方,由27个小方块构成,共三层,每层9个小方块.我的Demo实现的就是三阶魔方.其他的魔方种类有二阶,四阶及更高阶,也有…
摘自[3D数学基础: 图形与游戏开发] 考虑在3D中两条以参数形式定义的射线: \(\vec{r_1}(t_1)=\vec{p_1}+t_1\vec{d_1}\) \(\vec{r_2}(t_2)=\vec{p_2}+t_2\vec{d_2}\) 我们能够解得它们的交点.暂时先不考虑\(t_1,t_2\)的取值范围.因此,我们考虑的是无限长的射线:同样,向量\(\vec{d_1},\vec{d_2}\)也不必是单位向量.如果这两条射线在一个平面中,那么和前一节的情况一样,也存在有一种可能性: 两…
在第一篇网络分解成点,线,面.第二篇分别点以球形,线以圆柱,面分别以MergerBatch整合批次显示.因为整合批次显示后,相应的点,线,面不能以Ogre本身的射线来选取,因为整合后,以点举例,多个点显示虽然不在一起,但是是一个Mesh.Ogre本身的检测只能检测到这里,在我们这不满足要求,相应的点,线,面检测都需要自己来计算. 在讲解本文之前,先看下射线的相关生成代码,只有先明白射线如何生成,生成最后是相对什么空间. [OgreVersion( , , , "Slightly differen…
引言 在上一节中,我讲述了如何实现射线与三角形的交叉检测算法.但是,我们应该知道,在游戏开发中,一个模型有很多的三角形构成,如果要对所有的物体,所有的三角形进行这种检测,就算现在的计算机运算能力,也是无法高效的完成.所以,我们需要通过其他的手段来提早剔除一些不可能发生交叉的物体,这种早退的思想,大量的运用在3D游戏技术中.在本篇文章中,我将像大家讲述如何实现射线与轴向包围盒AABB的交叉检测.如果读者不明白什么是轴向包围盒,请看这篇文章. Ray-AABB交叉检测算法 现如今,有很多的Ray-A…
http://blog.csdn.net/i_dovelemon/article/details/38342739 引言 在上一节中,我讲述了如何实现射线与三角形的交叉检测算法. 但是,我们应该知道,在游戏开发中,一个模型有很多的三角形构成,如果要对所有的物体,所有的三角形进行这种检测,就算现在的计算机运算能力,也是无法高 效的完成.所以,我们需要通过其他的手段来提早剔除一些不可能发生交叉的物体,这种早退的思想,大量的运用在3D游戏技术中.在本篇文章中,我将像大家讲 述如何实现射线与轴向包围盒A…
本文简要分析了Unity中射线检测的基本原理及用法,包括: Ray 射线 RaycastHit 光线投射碰撞信息 Raycast 光线投射 SphereCast 球体投射 OverlapSphere 相交球等 项目地址:Raycast - SouthBegonia Ray 射线 含义:官方解释为一条无穷的线,开始于origin点,朝向direction方向(但是,根据项目验证来看其默认长度为单位向量,只有对direction进行乘以倍率,才可实现延长射线,而非无穷) 用法: Ray ray =…
http://www.xiaobao1993.com/231.html 射线是一个无穷的线,开始于origin并沿着direction方向. 当射线碰到物体后.它就会停止发射. 在屏幕中拉一个CUBE,并用鼠标点击它 using UnityEngine; using System.Collections; public class TestRay : MonoBehaviour { void Update() { if (Input.GetMouseButton(0)) { Debug.Log(…
射线:射线是3D世界一个向一个方向发射的一条无终点的线,在发射轨迹中与其他物体发生碰撞时,它将停止发射. 用途:射线范围比较广,多用于碰撞检测(如:子弹飞行是否击中目标).角色移动等. Ray是一个结构体: 变量: Direction:射线的方向 Origin:射线的起点. 构造函数: Ray:构造一条射线. 方法: GetPoint:返回距离单位沿射线点. ToString:转换成字符串. 相关API: Ray ray=Camera.main.ScreenPointToRay(Vector3…
  最近在解决三维问题时,需要判断线段是否与立方体交叉,这个问题可以引申为:射线是否穿过立方体AABB.   在3D游戏开发中碰撞检测普遍采用的算法是轴对齐矩形边界框(Axially Aligned Bounding Box, AABB)包装盒方法,其基本思想是用一个立方体或者球体完全包裹住3D物体对象,然后根据包装盒的距离.位置等相关信息来计算是否发生碰撞. slab的碰撞检测算法   本文接下来主要讨论射线与AABB的关系,主要对box2d碰撞检测使用的slab的碰撞检测算法(Slabs m…
Peter Shirley-Ray Tracing in One Weekend (2016) 原著:Peter Shirley 下篇主要对本书的后5章节进行学习,包括材质球的Metal,和Dielectrics.世界空间中相机的位置,相机通过光圈和焦距实现景深效果,最后结合全书知识点,渲染出一个如本篇封面的场景. https://github.com/EStormLynn/Peter-Shirley-Ray-Tracing-in-one-weenkend 目录 Chapter8:Metal C…