首页 / 浏览问题 / 桌面GIS / 问题详情
请问有碰撞分析的demo么?
14EXP 2017年02月28日
我想知道碰撞分析的模型导入和运动轨迹是用什么类来编写的?

1个回答

SuperMap.Realspace.SpatialAnalyst 命名空间CollisionAnalysis 类
胡林
1
5,985EXP 2017年02月28日
二次开发怎么把模型显示到场景里面?
你好,组件的二次开发还是桌面插件,模型是什么格式
组件的二次开发,模型是obj格式
请问你们那有组件二次开发碰撞分析的示例代码么?
没有,我测试好了给你解决方案
好的,麻烦了
组件没有将obj导入成数据集的方法,所以建议使用以下方法:在场景中添加KML图层---->在KML图层上添加模型。示范代码我在下面给你贴出来
_openfile = new OpenFileDialog();
                _openfile.Filter = "obj模型(*.obj*)|*.obj*";
                
                Model model = new Model();
                if (_openfile.ShowDialog() == DialogResult.OK)
                {
                    string filename = _openfile.FileName;
                    model.FromFile(filename);
                }
                GeoModel3D geomodel3d = new GeoModel3D(model);
                Point3D point = new Point3D();
                point.X = 116.4571;
                point.Y = 39.9132;
                point.Z = 21;
                geomodel3d.Position = point;
                geomodel3d.Style3D = new GeoStyle3D();
                geomodel3d.Style3D.AltitudeMode = AltitudeMode.Absolute;
                geomodel3d.Style3D.BottomAltitude = 0;
                geomodel3d.Style3D.ExtendedHeight = 21;
                feature3d = m_layer3DKML.Features.Add(geomodel3d);
                Camera camera = new Camera(116.4571, 39.9132, 40, AltitudeMode.RelativeToGround);

                sceneform._SceneControl.Scene.Fly(camera, 1000);

                sceneform._SceneControl.Scene.Refresh();

忘了注释m_layer3DKML是layer3dkml类型

好的,我试下谢谢啦
对了,还有这个方法你可以看一下ObliquePhotogrammetry3DModelTool.OBJTOOSGB 方法,先把obj转成osgb,然后就可以用ImportSettingModelOSG 类导入成数据集了

不好意思在问下layer3dkml这个怎么赋值啊?

Layer3Dlayer3d=sceneform._SceneControl.Scene.Layers.Add(filename,Layer3DType.KML, true);
m_layer3DKML = layer3d as Layer3DKML;

请问 layer3d 的filename是那个模型的路径么?我用了模型的路径然后它是为空的

用绝对路径的话用@“你的路径”,下次你把你的代码贴出来给我看看

我是这样写的

你这是添加模型的路径,不是添加KML图层的路径,另外问一下,你要添加的obj模型是单个的还是多个的

 _openfile = new OpenFileDialog();
                _openfile.Filter = "KML文件(*.kml*)|*.kml*";
                if (_openfile.ShowDialog() == DialogResult.OK)
                {

                    string filename = _openfile.FileName;
                    Layer3D layer3d = sceneform._SceneControl.Scene.Layers.Add(filename, Layer3DType.KML, true);
                    m_layer3DKML = layer3d as Layer3DKML;
                    sceneform._SceneControl.Scene.EnsureVisible(layer3d);
                    sceneform._SceneControl.Scene.Refresh();
                }

单个模型是先添加KML图层到场景,再将你的模型添加到KML图层的featrues上,代码上面都给你贴出来了,多个模型建议先转成OSGB,再导入成数据集,再添加到场景上。ObliquePhotogrammetry3DModelTool.OBJTOOSGB 方法,先把obj转成osgb,然后就可以用ImportSettingModelOSG 类导入成数据集了

这是添加单个的,就是想实现碰撞分析

那就按照添加KML图层到场景,再将你的模型添加到KML图层的featrues上,最后把你的模型绑定成碰撞分析里面的模型,应该就可以了

这样啊,谢谢啦,最后再问下,kml文件能自动生成么?还是必须要手动添进去?
组件可以用XML来创建KML文件,但是如果你不清楚KML文件格式的话,建议先在桌面创建好KML文件,导出来再在组件里面使用。
<?xml version="1.0" encoding="utf-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
  <Document>
    <name/>
    <visibility>1</visibility>
  </Document>
</kml>

这是一个在桌面创建好的KML文件的XML语句,你可以参考一下
好的,谢谢啦
不客气哟

不好意思,我又来问你了我这样写生成出来的xml文件在你们的桌面平台能显示出模型在我写的场景里显示不出来,是不是我有什么参数设置错了呀?

你的KML文件是在桌面生成好的还是自己通过XML语句生成的
自己通过xml语句生成的
我看你代码是不是没将生成好的KML图层加到场景中
它是通过feture3Ds.Add()添加到场景里的么?
我上面给了把KML添加到场景的代码,你给我看的代码的倒数第二句是生成了一个KML文件是吧,你把这个文件添加到对应的场景中就好了啊
是的,这个是是生成了kml文件,我找下怎么把它添加进场景里
你看我上面的你的回复,有示例代码
sceneControl.Scene.EnsureVisible是这个吧?

_openfile = new OpenFileDialog();
                _openfile.Filter = "KML文件(*.kml*)|*.kml*";
                if (_openfile.ShowDialog() == DialogResult.OK)
                {

                    string filename = _openfile.FileName;
                    Layer3D layer3d = sceneform._SceneControl.Scene.Layers.Add(filename, Layer3DType.KML, true);
                    m_layer3DKML = layer3d as Layer3DKML;
                    sceneform._SceneControl.Scene.EnsureVisible(layer3d);
                    sceneform._SceneControl.Scene.Refresh();
                }

filename可以写你生成KML时候的绝对路径

报错,还有别的方法没crying

你这儿不是有一个KML的路径吗,直接用这个路径就好了,干嘛还要再重新选择一次路径

我用上面那串代码我换了个GeoModel类它能显示三角片,就像上面这个图一样,用GeoModel3D类它就不显示,用Model类它直接报“外部组件异常”异常

GeoModel3D类我测试过,正常显示,GeoModel类我也测试过,跟你的效果一样,所以用GeoModel3D类

GeoModel只支持SGM和3DS的数据,不支持obj数据

我用你发给我的代码

   Model model = new Model();
                if (_openfile.ShowDialog() == DialogResult.OK)
                {
                    string filename = _openfile.FileName;
                    model.FromFile(filename);
                }
                GeoModel3D geomodel3d = new GeoModel3D(model);

它执行到model.FromFile(filename);这步就报“外部主键异常”了。 

用绝对路径试试
请问碰撞分析中的运动是用什么类写的呢

SuperMap.Realspace.SpatialAnalyst 命名空间CollisionAnalysis 类

知道是这个,这个没有运动轨迹啊这个是不会动的
怎么让碰撞分析的模型动起来呢,是改变模型的位置么?
可以对模型做一个节点动画,不过这个方法我暂时没有测试,你可以先自己做一下,我马上测试NodeAnimation类
好的,我用这个类试试
我测试了一下,节点动画不行,再试试如下方法:在你画的线上取N个点,通过时间函数Timer来控制模型出现在你取的点上,执行碰撞分析,这样子又能达到动画效果。这样子做应该没有问题,我明天继续给你测试
谢谢啦,麻烦你这么久
不客气,共同学习
请问怎么在线上取点呢我找了一下没找到
GeoLine.FindPointOnLineByDistance 方法
这个不是2D的线么,画的点是3D的点呀
3D点的XY坐标对应2D点的XY坐标,2D点可以构建2D线
你好,我测试好了,用节点动画可以实现,用时间函数控制,并通过NodeAnimation.Postition 属性 获取此时模型的空间位置,将此位置设置为CollisionAnalysis .Position ,就可以做到动态显示碰撞区域
能示范一下你说的时间器控制模型移动么?

思路是这样,具体的你得自己调整

节点动画你知道怎么做吧,比较简单了
知道,帮助里有
谢谢啦哟

你好,还想问下,模型重叠怎么办

是动画模型和碰撞测试的模型重叠了对吧
嗯嗯,是的
等我测试好了跟你说
你好,可以把动画模型隐藏掉么?
不能,我们正在给你解决这个问题,可以确定桌面是由节点动画来运动的,也是获取此时动画的位置

好的吧,我刚才试了,隐藏掉节点动画就不会动了crying

你尝试了让模型运动起来同时分析碰撞吗
动起来也能分析,就是两个模型重叠
我看看你的代码,就动起来分析的那段
它用那个分析方法就能分析了,一直在分析着的,我就是改变碰撞分析的位置

我就是这样写的,时间器就是改变分析的位置

你们测试的会重叠么?
你把碰撞测试模型的透明度设为0,CollisionAnalysis..::.Opacity 属性
一样的啊,设为0,那个运动模型还在啊
设置feature3d.IsVisible = false即可隐藏节点动画,并且模型还在运动
我看一下你AddTimer,AddModlePosition,AddModelParameters三个函数
是哪个类的啊?
这三个是把模型的信息显示到textbox里的

就这三个函数

这三个是往text控件里显示模型的坐标,透明度等信息的
所以这个功能你做好了吗,效果是否跟桌面一样
...