查看: 7927|回复: 32

关于线段求交

[复制链接]

该用户从未签到

发表于 2013-3-12 21:58:22 | 显示全部楼层 |阅读模式
画一条线,和场景中的模型求交,如果有交点的话输出交点坐标,为什么明明不相交,还是会输出坐标呢?

该用户从未签到

发表于 2013-3-13 07:56:33 | 显示全部楼层
肯定是您的使用方法有问题

该用户从未签到

 楼主| 发表于 2013-3-13 12:23:29 | 显示全部楼层
liuzhiyu123 发表于 2013-3-13 07:56
肯定是您的使用方法有问题

我刚接触osg,还请大师指点,该怎么用啊

该用户从未签到

发表于 2013-3-13 12:32:03 | 显示全部楼层
使用LineSegmentIntersection 就行了,注意坐标系的设置

该用户从未签到

 楼主| 发表于 2013-3-13 12:42:20 | 显示全部楼层
liuzhiyu123 发表于 2013-3-13 12:32
使用LineSegmentIntersection 就行了,注意坐标系的设置

还有个问题就是intersectionvisitor 没有addLineSegment?  就是我看的书上是intersectvisitor,,现在不是改成intersectionvisitor 了怎么就没有addLineSegment这个方法了

该用户从未签到

发表于 2013-3-13 12:43:19 | 显示全部楼层
不需要了 直接作为构造函数的参数传进去就行了

该用户从未签到

 楼主| 发表于 2013-3-13 12:53:17 | 显示全部楼层
liuzhiyu123 发表于 2013-3-13 12:43
不需要了 直接作为构造函数的参数传进去就行了

能举个例子么,我这水平实在是不行,呵呵,给您添麻烦了

该用户从未签到

发表于 2013-3-13 12:53:48 | 显示全部楼层
看osgPick 这个例子就行了 基本都是固定用法

该用户从未签到

发表于 2013-3-13 16:11:37 | 显示全部楼层
我也遇到同样的问题了,都说是我计算错误,我都没计算啊,碰撞的结果总是不对,鼠标点击碰撞,可能会碰撞到模型内部,都不知道这么点是怎么来的,点击用的下面的代码:
未命名.jpg
黄色部分在模型内部
x=ea.getX();
y=ea.getY();
if (ea.getButton()==1)
{
osgUtil:ineSegmentIntersector::Intersections intersections;

if (viewer->computeIntersections(x,y,intersections))
{
osgUtil::LineSegmentIntersector::Intersection intersection=*intersections.begin();
_point=osg::Vec3(intersection.getWorldIntersectPoint());
}
这段是用线求交算的,有的时候明明碰撞到很多点,结果就给我输出了起点和终点,不知道为什么呀????
还有一个问题,同一个面片,起点和终点都在这个面片上居然都会产生交点,如图 未命2名.jpg 红色黄色区分产生的交点
osg::ref_ptr< osgUtil::LineSegmentIntersector > _lineSegmentIntersector = new osgUtil::LineSegmentIntersector(p_start,p_end);  
        osgUtil::IntersectionVisitor _iv(_lineSegmentIntersector.get());
        model->accept(_iv);
        osg::Vec3Array *bt=new osg::Vec3Array;
        osgUtil::LineSegmentIntersector::Intersections _intersections = _lineSegmentIntersector->getIntersections();  
        int _intersectionNumber=_intersections.size();
        osgUtil::LineSegmentIntersector::Intersections::iterator hitr = _intersections.begin();
        for (; hitr != _intersections.end();hitr++)
        {
                bt->push_back(hitr->getWorldIntersectPoint());
        }

求大师传道授业解惑……

该用户从未签到

发表于 2013-3-14 08:11:34 | 显示全部楼层
intersections 记录了所有的交点,您区begin 当然就是一个

该用户从未签到

发表于 2013-3-14 09:50:46 | 显示全部楼层
liuzhiyu123 发表于 2013-3-14 08:11
intersections 记录了所有的交点,您区begin 当然就是一个

非常感谢您的回复,begin()是取得鼠标点击到的第一个交点对么?之前做相交测试的时候,array说碰撞有误差,用double类型的也不行,因为碰撞内部还是用的float,让我把鼠标点击的线段两端都延伸一段,我试了一下,碰撞的结果,还是没有规律,如图: 11.jpg
这里面,线是通过鼠标分别点击模型表面形成的(线段的两端点都位于模型的同一个平面内),蓝色的球代表线段和模型的交点,可见,当相交用的线段全部在平面上时,出现的情况就是可能相交,可能不交,相交可能在端点,也可能在中间任何一个点。

osg::Vec3d n1=p_start-p_end;n1.normalize();
        osg::Vec3d n2=p_end-p_start;n2.normalize();
        osg::Vec3d pStart=p_start+n1;//延长后的起点
        osg::Vec3d pEnd=p_end+n2;//延长后的终点
        osg::ref_ptr< osgUtil:ineSegmentIntersector > _lineSegmentIntersector = new osgUtil::LineSegmentIntersector(pStart,pEnd);

不知道是什么原因,还没有找到源码是怎么写的,求助……

该用户从未签到

发表于 2013-3-14 09:59:21 | 显示全部楼层
没有找到源码是怎么写的? 完完整整的都在LineSegmentIntersector.cpp 中

该用户从未签到

发表于 2013-3-14 10:20:03 | 显示全部楼层
  1. osg::Vec3d n1=p_start-p_end;n1.normalize();
  2. osg::Vec3d n2=p_end-p_start;n2.normalize();
  3. osg::Vec3d pStart=p_start+n1;//延长后的起点
  4. osg::Vec3d pEnd=p_end+n2;//延长后的终点
复制代码
。。。您这就叫做延长了么,还有您可以提交一个足够短的,可以运行且说明问题的程序让别人帮助调试。否则单凭您每次提供一点点散碎的信息,没有办法确定问题所在

该用户从未签到

发表于 2013-3-14 10:51:50 | 显示全部楼层
array 发表于 2013-3-14 10:20
。。。您这就叫做延长了么,还有您可以提交一个足够短的,可以运行且说明问题的程序让别人帮助调试。否则单 ...

那个不就是按照对应的方向向外延长单位向量么?难道不对?希望指点,拜谢……


下面是测试代码
  1. #include <osgViewer/Viewer>
  2. #include <osgViewer/ViewerEventHandlers>

  3. #include <osg/Geode>
  4. #include <osg/Geometry>
  5. #include <osg/Node>
  6. #include <osg/Group>
  7. #include <osg/LineSegment>
  8. #include <osg/ShapeDrawable>
  9. #include <osg/BlendColor>
  10. #include <osg/Material>
  11. #include <osg/BoundingBox>
  12. #include <osg/ComputeBoundsVisitor>
  13. #include <osg/Shape>
  14. #include <osg/PositionAttitudeTransform>

  15. #include <osgDB/ReadFile>
  16. #include <osgDB/WriteFile>

  17. #include <osgGA/GUIEventHandler>
  18. #include <osgGA/StateSetManipulator>

  19. #include <osgUtil/Optimizer>
  20. #include <osgUtil/IntersectionVisitor>
  21. #include <osgUtil/IntersectVisitor>

  22. #include <math.h>

  23. using namespace std;
  24. typedef std::vector<osg::Vec3dArray *> ArrayVector;
  25. osg::ref_ptr<osg::Group>modelGroup=new osg::Group;
  26. osg::Vec3Array *pointList=new osg::Vec3Array;

  27. void getIntersections( osg::Vec3dArray *buttomPointList,osg::Group* sphereGroup, osg::Node* model, osg::Vec3d p_start,osg::Vec3d p_end)
  28. {
  29.         osg::Vec3d n1=p_start-p_end;n1.normalize();
  30.         osg::Vec3d n2=p_end-p_start;n2.normalize();
  31.         osg::Vec3d pStart=p_start+n1;
  32.         osg::Vec3d pEnd=p_end+n2;
  33.         osg::ref_ptr< osgUtil::LineSegmentIntersector > _lineSegmentIntersector = new osgUtil::LineSegmentIntersector(pStart,pEnd);  
  34.         osgUtil::IntersectionVisitor _iv(_lineSegmentIntersector.get());
  35.         model->accept(_iv);
  36.         osgUtil::LineSegmentIntersector::Intersections _intersections = _lineSegmentIntersector->getIntersections();  
  37.         int _intersectionNumber=_intersections.size();
  38.         osgUtil::LineSegmentIntersector::Intersections::iterator hitr = _intersections.begin();

  39.         osg::ref_ptr<osg::Geode>viewLine=new osg::Geode;
  40.         osg::ref_ptr<osg::Geometry>geom=new osg::Geometry;
  41.         osg::ref_ptr<osg::Vec3Array>v=new osg::Vec3Array;
  42.         osg::Vec4 color=osg::Vec4(1.0f,0.0f,0.0f,1.0f);
  43.         v->push_back(p_start);
  44.         v->push_back(p_end);
  45.         geom->setVertexArray(v.get());
  46.         osg::ref_ptr<osg::Vec4Array>vc=new osg::Vec4Array;
  47.         vc->push_back(color);
  48.         geom->setColorArray(vc.get());
  49.         geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINES,0,2));
  50.         viewLine->addDrawable(geom);
  51.     sphereGroup->addChild(viewLine);
  52.         for (; hitr != _intersections.end();hitr++)
  53.         {   
  54.                 osg::Vec3d point=hitr->getWorldIntersectPoint();
  55.                 cout<<"    x:   "<<point.x()<<"    y:   "<<point.y()<<"    z:   "<<point.z()<<endl;
  56.                 buttomPointList->push_back(point);
  57.                                  osg::Geode* geode=new osg::Geode;
  58.                                  osg::ShapeDrawable *viewPoint=new osg::ShapeDrawable(new osg::Sphere(point,0.1f));
  59.                                  viewPoint->setColor(osg::Vec4(0.0f,0.0f,1.0f,1.0f));
  60.                                  geode->addDrawable(viewPoint);
  61.                                  sphereGroup->addChild(geode);
  62.         }
  63. }
  64. class PolygonHandler:public osgGA::GUIEventHandler
  65. {
  66. public:
  67.         PolygonHandler()
  68.         {
  69.         }
  70.         ~PolygonHandler()
  71.         {}
  72.         bool PolygonHandler::handle(const osgGA::GUIEventAdapter &ea,osgGA::GUIActionAdapter &aa)
  73.         {
  74.                 osgViewer::View *viewer=dynamic_cast<osgViewer::View*>(&aa);
  75.                 switch(ea.getEventType())
  76.                 {
  77.                 case (osgGA::GUIEventAdapter::PUSH):
  78.                         {
  79.                                 x=ea.getX();
  80.                                 y=ea.getY();
  81.                                 if (ea.getButton()==1)
  82.                                 {
  83.                                         osgUtil::LineSegmentIntersector::Intersections intersections;
  84.                                         if (viewer->computeIntersections(x,y,intersections))
  85.                                         {
  86.                                                 osgUtil::LineSegmentIntersector::Intersection intersection=*intersections.begin();
  87.                                                 _point=osg::Vec3d(intersection.getWorldIntersectPoint());
  88.                                             pointList->push_back(_point);
  89.                                                 if (pointList->size()>=2&&pointList->size()%2==0)
  90.                                                 {
  91.                                                         osg::Vec3d Point1=pointList->at(pointList->size()-2);
  92.                                                         osg::Vec3d Point2=pointList->at(pointList->size()-1);
  93.                                                         osg::ref_ptr< osg::Vec3dArray> buttomList  =  new osg::Vec3dArray;
  94.                                                         osg::ref_ptr<osg::Group>group=new osg::Group;
  95.                                                         getIntersections(buttomList,group,modelGroup,Point1,Point2);
  96.                                                         viewer->getSceneData()->asGroup()->addChild(group);
  97.                                                 }
  98.                                         }
  99.                                 }
  100.                                 return false;
  101.                         }break;
  102.                 default:
  103.                         return false;
  104.                 }
  105.         }
  106. private:
  107.         osg::Vec3d _point;
  108.         double x;
  109.         double y;
  110. };


  111. int main()
  112. {
  113.         osg::ref_ptr<osgViewer::Viewer>viewer=new osgViewer::Viewer;
  114.         osg::ref_ptr<osg::Group>root=new osg::Group;
  115.         osg::ref_ptr<osg::Node>model=osgDB::readNodeFile("moxing.osg");

  116.         modelGroup->addChild(model.get());
  117.         root->addChild(modelGroup.get());

  118.         viewer->addEventHandler(new osgViewer::WindowSizeHandler);
  119.         viewer->addEventHandler(new osgGA::StateSetManipulator(viewer->getCamera()->getOrCreateStateSet()));
  120.         viewer->addEventHandler(new PolygonHandler);

  121.         osgUtil::Optimizer optimizer;
  122.         optimizer.optimize(root.get());

  123.         viewer->setSceneData(root.get());
  124.         viewer->realize();
  125.         viewer->run();
  126.         return 0;
  127. }
复制代码
moxing.osg.gz (110.35 KB, 下载次数: 1)

该用户从未签到

发表于 2013-3-14 16:49:01 | 显示全部楼层
妹纸,我也最近做这个~对于碰撞检测也是不太清楚,总有些“灵异现象”(如你贴的图中)……还望此贴能早日解惑

该用户从未签到

 楼主| 发表于 2013-3-14 20:13:29 | 显示全部楼层
array 发表于 2013-3-14 10:20
。。。您这就叫做延长了么,还有您可以提交一个足够短的,可以运行且说明问题的程序让别人帮助调试。否则单 ...

大神出现了,我顺便再问个问题:从一个点出发做多条射线,做相交检测,怎么返回有多少条线是有相交多少条是没相交的。

该用户从未签到

发表于 2013-3-15 08:10:25 | 显示全部楼层
huahuawei88 发表于 2013-3-14 20:13
大神出现了,我顺便再问个问题:从一个点出发做多条射线,做相交检测,怎么返回有多少条线是有相交多少条 ...

使用 IntersectorGroup

该用户从未签到

发表于 2013-3-15 08:14:04 | 显示全部楼层
本帖最后由 liuzhiyu123 于 2013-3-15 08:14 编辑

这是什么逻辑?
                                        if (viewer->computeIntersections(x,y,intersections))
                                        {
                                                osgUtil::LineSegmentIntersector::Intersection intersection=*intersections.begin();
                                                _point=osg::Vec3d(intersection.getWorldIntersectPoint());
                                            pointList->push_back(_point);
                                                if (pointList->size()>=2&&pointList->size()%2==0)
                                                {
                                                        osg::Vec3d Point1=pointList->at(pointList->size()-2);
                                                        osg::Vec3d Point2=pointList->at(pointList->size()-1);
                                                        osg::ref_ptr< osg::Vec3dArray> buttomList  =  new osg::Vec3dArray;
                                                        osg::ref_ptr<osg::Group>group=new osg::Group;
                                                        getIntersections(buttomList,group,modelGroup,Point1,Point2);
                                                        viewer->getSceneData()->asGroup()->addChild(group);
                                                }

该用户从未签到

发表于 2013-3-15 08:50:27 | 显示全部楼层
liuzhiyu123 发表于 2013-3-15 08:14
这是什么逻辑?
                                        if (viewer->computeIntersections(x,y,interse ...

就是只有当单击的点数是2或者2的倍数的时候,就取最后点击的两个点作为线段相交的起点和终点

该用户从未签到

 楼主| 发表于 2013-3-18 13:47:24 | 显示全部楼层
liuzhiyu123 发表于 2013-3-15 08:10
使用 IntersectorGroup

从一点出发画很多射线,有什么简单的方法么

该用户从未签到

发表于 2013-3-18 14:01:41 | 显示全部楼层
huahuawei88 发表于 2013-3-18 13:47
从一点出发画很多射线,有什么简单的方法么

暂时没有,除非自己领想别的算法了

该用户从未签到

 楼主| 发表于 2013-3-18 14:55:03 | 显示全部楼层
liuzhiyu123 发表于 2013-3-18 14:01
暂时没有,除非自己领想别的算法了

那该怎么弄啊,一条一条的话吗?能详细讲讲吗?或者给点代码也行,新手,麻烦大神了!

该用户从未签到

发表于 2013-3-18 15:01:30 | 显示全部楼层
IntersectorGroup 将每个LinesegmentIntersector 添加到其中void addIntersector(Intersector* intersector),然后获取的时候 对添加的每个LinesegmentIntersector 进行操作就行了

该用户从未签到

 楼主| 发表于 2013-3-18 18:15:56 | 显示全部楼层
liuzhiyu123 发表于 2013-3-18 15:01
IntersectorGroup 将每个LinesegmentIntersector 添加到其中void addIntersector(Intersector* intersector ...

就是现在我想把这些线也当做Geometry画出来,就是可以看见的那种,怎么办?
DrawArrays(osg:rimitiveSet:INES,0,2) ,每次只能画一条,要是线很多的话,上百条,该怎么办?(别笑哈,实在是太笨了)

该用户从未签到

发表于 2013-3-19 07:46:48 | 显示全部楼层
huahuawei88 发表于 2013-3-18 18:15
就是现在我想把这些线也当做Geometry画出来,就是可以看见的那种,怎么办?
DrawArrays(osg:rimitiveS ...

哦?您那么确定就只能画一条?看看下面的您或许会有答案
QQ截图20130319074558.png

该用户从未签到

发表于 2013-3-19 10:08:43 | 显示全部楼层
Berly 发表于 2013-3-14 09:50
非常感谢您的回复,begin()是取得鼠标点击到的第一个交点对么?之前做相交测试的时候,array说碰撞有误差 ...

其实可以把intesect函数里面的第三句话注释的 具体名字忘了好像是判断直线和几何体的包围盒是否相交(里面会将直线裁剪的)

该用户从未签到

 楼主| 发表于 2013-3-19 15:10:45 | 显示全部楼层
本帖最后由 huahuawei88 于 2013-3-19 15:29 编辑
liuzhiyu123 发表于 2013-3-19 07:46
哦?您那么确定就只能画一条?看看下面的您或许会有答案
  1. #include <Windows.h>
  2. #include <osgViewer/Viewer>
  3. #include <osgViewer/ViewerEventHandlers>
  4. #include <osgGA/StateSetManipulator>
  5. #include <osgDB/ReadFile>
  6. #include <osg/LineSegment>
  7. #include <osgUtil/LineSegmentIntersector>
  8. #include <osgUtil/IntersectionVisitor>
  9. #include <osgUtil/IntersectVisitor>
  10. #include <osg/MatrixTransform>
  11. #include <osg/Group>
  12. #include <osg/Node>
  13. #include "iostream"
  14. using namespace std;
  15. int main()
  16. {
  17.         osg::ref_ptr<osg::Node> cow = osgDB::readNodeFile("cow.osg");//第一个节点
  18.         osg::ref_ptr<osg::Node> axes = osgDB::readNodeFile("axes.osgt");//第二个节点
  19.         osg::ref_ptr<osg::MatrixTransform> mt_cow = new osg::MatrixTransform;
  20.         mt_cow->setMatrix(osg::Matrix::scale(osg::Vec3(0.5,0.5,0.5))*osg::Matrix::translate(osg::Vec3(-10,0,0)));
  21.         mt_cow->addChild(cow.get());
  22.         osg::ref_ptr<osg::MatrixTransform> mt_axes = new osg::MatrixTransform;
  23.         mt_axes->addChild(axes.get());
  24.         osg::ref_ptr<osg::Group> root = new osg::Group;
  25.         root->addChild(mt_cow.get());
  26.         root->addChild(mt_axes.get());
  27.         osgViewer::Viewer * viewer = new osgViewer::Viewer;
  28.         viewer->addEventHandler(new osgGA::StateSetManipulator(viewer->getCamera()->getOrCreateStateSet()));
  29.         osg::Vec4Array* colors = new osg::Vec4Array;
  30.         colors->push_back(osg::Vec4(1.0f,0.0f,0.0f,1.0f));

  31. // 碰撞检测
  32.         osg::ref_ptr<osg::Group> group = new osg::Group;
  33.         osg::Vec3f p_end;
  34.         osg::Vec3 p_start(0,0,0);
  35.         int j=0;
  36.         for (int i=0;i<100;++i)
  37.         {               
  38.                 osg::Vec3Array* coords = new osg::Vec3Array;
  39.                 coords->push_back(p_start);  
  40.                 float dt = 5/100.0f;
  41.                 coords->push_back(osg::Vec3f(-10,dt*i,0));
  42.                 osg::Vec3Array* normals = new osg::Vec3Array;
  43.                 normals->push_back(osg::Vec3(0.0f,0.0f,1.0f));                  
  44.                 osg::ref_ptr<osg::Geometry> geom = new osg::Geometry;
  45.                 geom->setVertexArray(coords);
  46.                 geom->setNormalArray(normals);
  47.                 geom->setColorArray(colors);
  48.                 geom->setColorBinding(osg::Geometry::BIND_PER_PRIMITIVE);
  49.                 geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINES,0,2));
  50.                 osg::ref_ptr<osg::Geode> geode = new osg::Geode;
  51.                 geode->addDrawable(geom.get());
  52.                 geode->setName("line");
  53.                 group->addChild(geode.get());
  54.                 root->addChild(group.get());

  55.                 osgUtil::LineSegmentIntersector::Intersections _intersections;       
  56.                 osg::ref_ptr< osgUtil::LineSegmentIntersector > _lineSegmentIntersector = new osgUtil::LineSegmentIntersector(p_start,osg::Vec3f(-10,dt*i,0));
  57.                 osgUtil::IntersectionVisitor _iv(_lineSegmentIntersector.get());
  58.                 //viewer->getSceneData()->accept(_iv);
  59.                 cow->accept(_iv);
  60.                 _intersections=_lineSegmentIntersector->getIntersections();
  61.                 int _intersectionNumber=_intersections.size();  
  62.                 if (_intersectionNumber!=0)
  63.                 {   
  64.                         osgUtil::LineSegmentIntersector::Intersections::iterator hitr = _intersections.begin();
  65.                         osg::Vec3 vec3_p1 =hitr->getWorldIntersectPoint();
  66.                         mt_axes->setMatrix(osg::Matrix::translate(vec3_p1));
  67.                         hitr++;
  68.                         colors->push_back(osg::Vec4(0.0f,1.0f,0.0f,1.0f));
  69.                         cout<<vec3_p1.x()<<"  "<<vec3_p1.y()<<"   "<<vec3_p1.z()<<endl;
  70.                         j++;                       
  71.                 }                       
  72.         }
  73.         cout<<j;
  74.         system("pause");       
  75.         viewer->setSceneData(root.get());
  76.         return viewer->run();

  77. }
复制代码
javascript:;javascript:;

这是我做的一个相交检测的例子,输出交点的坐标,,这100条线里面有几条是个模型有交的,但是却输出了100个交点坐标,这些点的坐标看上去也不对,求指导啊,还是对相交检测这段代码不是很明白,要是能单独开个帖子把这一块代码好好讲一下就好了,方便新手啊,呵呵,,真是给您添麻烦了,感谢你一直给我解答
result.jpg
cmd.jpg

该用户从未签到

 楼主| 发表于 2013-3-19 15:33:09 | 显示全部楼层
garyliyong 发表于 2013-3-19 10:08
其实可以把intesect函数里面的第三句话注释的 具体名字忘了好像是判断直线和几何体的包围盒是否相交(里面 ...

您说的这个跟物体的包围盒有交点我也有点这个感觉,,,能不能说的详细一点啊,在下新手,急等,盼……

该用户从未签到

发表于 2013-3-19 15:38:27 | 显示全部楼层
mt_cow->setMatrix(osg::Matrix::scale(osg::Vec3(0.5,0.5,0.5))*osg::Matrix::translate(osg::Vec3(-10,0,0))); 牛已经有变换了,cow->accept(_iv); 已经不是在同一个父坐标下了,显示的东西估计是不对的

该用户从未签到

发表于 2013-3-19 17:38:27 | 显示全部楼层
huahuawei88 发表于 2013-3-19 15:33
您说的这个跟物体的包围盒有交点我也有点这个感觉,,,能不能说的详细一点啊,在下新手,急等,盼……

osg::Vec3d s(_start), e(_end);
if ( !intersectAndClip( s, e, drawable->getBound() ) ) return;
这两句是将直线与包围盒求交,并将直线与包围盒相交的最小点和最大点作为直线的起始点,你将第二句注释掉,就是原始的直线段求交了,这个你试试看吧。我也遇到过求交失败的情况,就将这句注掉了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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