查看: 2728|回复: 5

osg中的单位问题

[复制链接]

该用户从未签到

发表于 2013-5-12 20:44:24 | 显示全部楼层 |阅读模式

1,osg中默认的长度单位是m,我的一个3dmax建的地形(ive格式)设置的默认单位是mm,我把地形读入osg中优化,然后重新写出成osg格式。再把地形(osg格式)读入场景中,发现和没有优化的地形(ive格式)相差将近100倍,(osg格式的比ive格式的大100左右),想请教下是怎么回事??
如果假设地形长为100m既3dmax中是100 000mm,那么读入osg中优化再写成osg格式时就成了100 000m?。然后读入这个osg格式的地形时他们的单位是相同的,既100 000m的osg地形,读入场景中还是100 000m.  而读入100 000mm的ive格式的地形在场景中应该也会自动变成100 000m 啊,如果这样的话读入osg格式的地形和读入ive格式的地形应该是没有区别的?不知道我这样分析错在哪里???
2,因为3dmax不能导出空节点,我就用小方块代替节点,然后导出后遍历节点再把模型挂上去,实现共享。问题是这样的,共享的一棵树在场景中居然有些大,有些小,我是把模型直接挂在方块上的。(后面问过大神,大神说把模型当成是方块的子节点就行了。)我不明白的是,为什么不管我怎么缩小还是放大方块,那些很大的树还是很大,很小的树还是很小,,如果说方块的大小不会影响树的大小,那为什么同一个模型(共享的)在场景中会出现不同的大小?不应该是一样大的吗?如果说方块的大小会影响树的大小,那么我一直缩小方块树的模型还是那么大。这个问题如果推广到其他模型上,是否能得到一个什么可遵循的规律呢??
谢谢!

该用户从未签到

发表于 2013-5-13 00:56:06 | 显示全部楼层
本帖最后由 VR_user_happy 于 2013-5-13 00:59 编辑

1.osg中默认的长度单位是m?
   我不这样认为:他跟其他的建模仿真工具一样,长度单位是1,没有单位长度,(不分是毫米,还是米),你认为是米,就是米,认为是毫米就是毫米。
      问题1主要是:你放入到仿真场景的所有模型,采用的建模体系是否一致?
     有些有3DMAX建的模型;
     有些是你不知道有什么建的,你直接拿来用:
    他们当然有区别?
    不同的模型建模体系是有差别的,应该有一个固定的系数
    而与仿真平台无关,他只是显示反应模型的大小;
    *.OSG  、*.ive 转化到 *.3ds 表明的是他们的建模体系不同,之间有一个比例关系对应
    A-->B 如果是放大,那么从B-->A就是缩小

   问题2:
    采用优化,优化不太清楚他的内部运作细节,但有一点可以猜测:
           它应该是把节点的比例Transform节点给优化掉了,所以,你的模型很可能突然变大,或突然变小(这与你的模型带的比例变形节点是否存在有关系),与显示平台无关(只与文件格式有关)。
           把比例Transform节点给丢掉是模型转化过程中常常遇到的。
问题3:
        共享的一棵树在场景中居然有些大,有些小-----的问题
     就是你建立的方块节点后,你把其他节点直接放过去,实际上是丢掉了原来节点相关的比例Transform节点,它就不是原来的大小了。
       这种变化你可以在Creator 建模环境中经常看到,对于这样的模型,你必需先要把它从数学属性(带Transform)直接转化为几何属性(不带Transform),你的模型就不会在转化过程中发生变化(变大或者缩小)
   关键是有这个MatrixTransform在这里,你要熟悉节点的关系结构图就清楚Tranform 与Node的关系了。

这样,下次你在写出模型、导出模型、转化模型时,就知道该注意些什么了!

该用户从未签到

 楼主| 发表于 2013-5-13 07:17:42 | 显示全部楼层
本帖最后由 1162810317 于 2013-5-13 07:39 编辑

[quote]VR_user_happy 发表于 2013-5-13 00:56

谢谢您的指点,1,
我说明下,就是我的场景都是自己和组员用3dmax做的,所以只存在max与osg中的转化。然后您后面说的只和文件格式有关,是不是说,那个放大并不是ive导入osg中造成的,是ive导入osg后写出osg格式造成的,如果osg优化后写出。ive 的话,那是否应该就没有变化?或者是用osg格式的导入osg中优化,再导出osg格式,这样就不存在变化呢?
2,然后就是我还是有些不明白你说的,就是如何把它从数学属性(带Transform)直接转化为几何属性(不带Transform)呢??
我实验过就是遍历到这个标记时,用node->asgroup()->addchild().和node->asTransform()->addchild();来挂模型效果是一样的,我的理解是(用您的话说就是)前者应该是不带数学属性的,后者是带数学属性的,前者应该不会导致挂的模型发生变化,但后者可能会让模型发生变化。但实验的结果是两者是一样的效果,都发生了变化。所以我不明白到底怎样把它从数学属性(带Transform)直接转化为几何属性(不带Transform)??
还有就是小方块的大小和模型的大小有关系没??小方块大模型一定大?或小方块小模型就·小吗???如果没有直接的关系那又是通过什么影响模型的呢???该如何解决呢??
谢谢!!

该用户从未签到

发表于 2013-5-13 12:02:02 | 显示全部楼层
本帖最后由 VR_user_happy 于 2013-5-13 12:07 编辑

1.
    那个放大并不是ive导入osg中造成的-------------->这个正确
    osg平台之上显示模型,如果有3DS插件,就可以直接读取*.3DS,如果没有,就需要转化为OSG平台可以认出的模型格式(*.ive,*.osg)
  2.
3dmax的模型 是*.3DS格式
         *.3DS转化为*.ive 就是A--->B的过程
         *.3DS转化为*.osg  就是A--->C的过程
    过程1:  
         *.3DS转化为*.ive 就可能已经存在放大
3.   
        *.ive  写出其中的子节点 *.OSG
      存在2个应该注意的问题:
           子节点 node 如果本身是Transform类型,父节点是Transform类型,
           请记住父亲节点的Transform也会作用到子节点上
         每个节点的实际大小
                  是所有父亲节点的Transform的累计与本节点的Transform一起叠加作用
       你再写出前,就要做矩阵的叠加运算后,才能写出!(或者保留父节点Transform的)
       所以你的遍历后的做法并不适用于所有的模型,他只适用于纯的不带数学属性(带Transform)的模型的写出!
     2种做法可以保证模型的在写出子节点(同种类型的文件格式)大小不发生改变:
         方式1:保留每一级父亲节点的所带的Transform,这种方法必须明确每一级的结构
         方式2:就是取出每一级的Transform做矩阵累计运算,得到最后只有一个总变化量的Transform
        再把它挂接到你的非Transform的节点上
         
        node->asgroup()和node->asTransform()这种判断本身就没有明白Transform的属性
    Transform节点本身就是Group类型
    应该用动态映射判断Dynamic_cast()是否是Transform节点
   过程2:
    还有一个问题就是你将导出的*.OSG再在3DMAX下显示:
     a.利用插件直接显示*.OSG(如果只有这一种类型的模型,没有其他类型),就不存在是否放大与缩小;如果有其它格式(如*.3ds),那就是这2种格式的差异,就相当于把*.OSG-->*.3ds了
     b. 如果*osg .-->*.3ds再在在3DMAX下显示,就是C-->A的过程
               会存在格式上的放大或者缩小了!

   

该用户从未签到

 楼主| 发表于 2013-5-13 14:39:38 | 显示全部楼层
VR_user_happy 发表于 2013-5-13 12:02
1.
    那个放大并不是ive导入osg中造成的-------------->这个正确
    osg平台之上显示模型,如果有3DS插 ...

哦,谢谢您详尽的解答,我再试试,看看问题能否解决。

该用户从未签到

发表于 2013-5-16 11:25:38 | 显示全部楼层
Transform是指MatrixTransform
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表