计算不在相机视野范围内的模型的方法

判断一个物体是否在相机视野内思路很简单,对场景中每一个模型上的定点进行遍历,如果该点在相机视野内,那么该模型就在相机视野内,遍历结束。所以只要场景中模型数量不高,顶点数量不高,该方法执行效率还是很有保障的。

那么怎样判断一个顶点在相机视野内呢?

通过以下这段代码即可获得当前相机视野的横向开角Hangle及纵向开角Vangle。

#Get the point of camera.

camDirection     = cmds.camera( activeCamera , q = True , worldCenterOfInterest = True )

camPosition      = cmds.camera( activeCamera , q = True , position = True )

#Get the vector of camera.

camUpDirection   = cmds.camera( activeCamera , q = True , worldUp = True )

camDirec         = [camDirection[i] - camPosition[i] for i in range(3)]

#Get the parameters of lens.

F = cmds.camera(activeCamera , q = True , focalLength = True)

H = cmds.camera(activeCamera , q = True , horizontalFilmAperture = True)

V = cmds.camera(activeCamera , q = True , verticalFilmAperture = True)

Hangle = math.degrees( math.atan2(H*25.4/2, F) )

Vangle = math.degrees( math.atan2(V*25.4/2, F) )

设相机中心到某顶点的向量为pointDir,相机方向的向量为camDirec,相机正上方的向量为camUpDirection,相机正侧方向量为camSideDirection;设camDirec与camUpDirection形成平面Vplane,camDirec与camUpDirection形成平面Hplane。只要pointDir与Vplane形成的夹角大于Vangle或者pointDir与Hplane形成的夹角大于Hangle,或者camDirec与pointDir相乘所得值小于0,那么就可以判断当前顶点不在相机视野范围内。反之该顶点处于相机视野范围内,顶点所在模型也处于相机视野范围内。

代码如下:

def calculateAngle(somepoint):
    pointDir = [somepoint[i]   - camPosition[i] for i in range(3)]

    camSideDirection = [camDirec[1]*camUpDirection[2]-camDirec[2]*camUpDirection[1],camDirec[2]*camUpDirection[0]-camDirec[0]*camUpDirection[2],camDirec[0]*camUpDirection[1] - camDirec[1]*camUpDirection[0]]

    #the angle between two vector.
    VerticAngle = math.degrees(math.asin((camUpDirection[0]*pointDir[0] + camUpDirection[1]*pointDir[1] + camUpDirection[2]*pointDir[2])/(math.sqrt(camUpDirection[0]*camUpDirection[0] + camUpDirection[1]*camUpDirection[1] + camUpDirection[2]*camUpDirection[2])*math.sqrt(pointDir[0]*pointDir[0] + pointDir[1]*pointDir[1] + pointDir[2]*pointDir[2] ))))

    #the angle between two vector.
    horizoAngle = math.degrees(math.asin((camSideDirection[0]*pointDir[0] + camSideDirection[1]*pointDir[1] + camSideDirection[2]*pointDir[2])/(math.sqrt(camSideDirection[0]*camSideDirection[0] + camSideDirection[1]*camSideDirection[1] + camSideDirection[2]*camSideDirection[2])*math.sqrt(pointDir[0]*pointDir[0] + pointDir[1]*pointDir[1] + pointDir[2]*pointDir[2] ))))

     #the angle between two vector.
    FrontAngle  =camDirec[0]*pointDir[0] + camDirec[1]*pointDir[1] + camDirec[2]*pointDir[2]

    if abs(horizoAngle) >Hangle:
        return False
    elif abs(VerticAngle) >Vangle:
        return False
    elif FrontAngle< 0:
        return False
    else:
        return True

该函数用于检测somepoint这个顶点是否在相机视野范围内,如果该函数返回False即表明somepoint不在相机视野范围内,返回True则反之。通过该函数对场景中所有模型的顶点进行遍历即可得知哪些模型在当前相机视野里哪些不在。

时间: 05-16

计算不在相机视野范围内的模型的方法的相关文章

如何做好站内主题内容模型的SEO优化

如今的SEO已经进入全新内容营销的算法体系,特别是当今一流的搜索引擎更能从内容情景,内容实体属性来处理排名,使得用户得到更准确的搜索结果. 对SEO而言,站内优化不再是简单的填写内容,对于主题内容优化需要重新定义了,本文将融入当今最新的SEO理念指引大家如何优化站内主题内容. 一.什么是SEO站内主题模型? 平时我们可以听到或看到很多关于SEO页面内容的老旧方法,比如: 1.看关键词密度是否达标? 2.文章内容字数是否够多? 3.内容是否够原创? 4.导入链接(外链)是否够多? 5.使用各种H标

The time machine-时间机器计算差值(二十四小时内)

The time machine-时间机器计算差值(二十四小时内):输入hours.minutes,1代表AM,0代表PM. //The time machine-时间机器计算差值(二十四小时内) #include<iostream> int computeDifference(int startHours, int startMinutes, bool startIsAM,int endHours,   int endMinutes,   bool endIsAM); int main()

块模型、内联模型、内联块模型

块模型(block模型) 1.块模型被浏览器渲染执行的时候会独占一行空间 2.即使块模型的宽度小于页面的宽度,块模型也会独占一行,也就是说块模型独占与它的宽度有关 3.如果要为一个html控件设置高度和宽度,那么这个控件必须是块模型,加display:block变成块模型 如超链接:<a href="https://i.cnblogs.com" style="background-color: #dedef8; display:block"></a

Selenium解决页面元素不在视野范围内的问题

当需要使用滚动条才能使页面元素显示在视野范围内时,必须用代码处理下,才能对其进行操作. 处理其实也很简单,就是调用JS函数. driver.executeScript("arguments[0].scrollIntoView(false);", e); 参数e 为WebElement 类型,方法executeScript是WebDriver中定义的方法.

小猪猪教你如何找回相机存储卡内的丢失数据

大家一般所说的相机卡, 不管是CF卡, SD卡, XD卡等, 其实都属于数据存储卡.因为一般的数码相机的默认内置空间是1-2G, 是没有办法满足存储大量数码照片的, 因此大多数相机都有卡槽可供增加额外的存储卡.因为误删, 格式化, 存储卡的读取故障,相机存储卡的数据属于最容易丢失的类型之一. 有什么办法可以找回相机存储卡内的丢失数据吗? 因为有一些相机有删除全部照片的功能, 有的时候将相机连在电脑上, 因为一些存储卡错误, 电脑系统 会提醒你格式化存储卡, 有的用户不小心就将存储卡给格式化了,结

Deep Learning(深度学习)之(三)Deep Learning的常用模型或者方法

九.Deep Learning的常用模型或者方法 9.1.AutoEncoder自动编码器 Deep Learning最简单的一种方法是利用人工神经网络的特点,人工神经网络(ANN)本身就是具有层次结构的系统,如果给定一个神经网络,我们假设其输出与输入是相同的,然后训练调整其参数,得到每一层中的权重.自然地,我们就得到了输入I的几种不同表示(每一层代表一种表示),这些表示就是特征.自动编码器就是一种尽可能复现输入信号的神经网络.为了实现这种复现,自动编码器就必须捕捉可以代表输入数据的最重要的因素

机器学习之深度学习常用的模型和方法

Deep Learning的常用模型或者方法 AutoEncoder自动编码器 Deep Learning最简单的一种方法是利用人工神经网络的特点,人工神经网络(ANN)本身就是具有层次结构的系统,如果给定一个神经网络,我们假设其输出与输入是相同的,然后训练调整其参数,得到每一层中的权重.自然地,我们就得到了输入I的几种不同表示(每一层代表一种表示),这些表示就是特征.自动编码器就是一种尽可能复现输入信号的神经网络.为了实现这种复现,自动编码器就必须捕捉可以代表输入数据的最重要的因素,就像PCA

Qt MVC设计模式:子类化抽象模型的方法

模型子类化参考 模型的子类需要提供很多在QAbstractItemModel中定义的虚函数的实现.需要实现的方法的数量取决于你想创建的子类的风格--它提供一个简单的列表视图,还是一个表格视图,或者是一个复杂的层次视图.从QAbstractListModel和QAbstractTableModel继承的子类可以直接利用这两个类的许多默认的虚函数. 子类中需要实现的方法可以分为三种: 1. 处理项数据:所有的模型需要实现方法来保证视图和委托能够查询模型的尺寸.检测每个项以及返回其中的数据. 2. 浏

也来说说关于未在本地计算机上注册“VFPOLEDB.1”的程序的解决方法

大家都知道VFP是一个非常古老的数据库.但是,还有一些单位用到这些数据库. 前段时间,也做了一个关于DBF数据导出的功能的测试.程序以前有同事写好了,但当我进行修改调试的时候,问题就出来了. 调试的时候,一切都是正常的,VFPOLEDBSetup.msi这个肯定得先安装. 但是,架设到IIS上之后,就不行了,出现未在本地计算机上注册"VFPOLEDB.1"的程序这样的错误. 由于之前也没碰过DBF文件导入导出或者操作方面的问题,所以,第一想到的是百度. 百度上面,当然有好多答案,基本上