3DS MAX9 导出插件 pMesh->GetNormal 无法获得正确的法线??

博客强调传入参数时,必须使用法线索引,而非顶点索引,这是信息技术中关于参数传入的关键要点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 因为传入参数必须写法线索引,而不是顶点索引!

我正在学习天工CAD C++二次开发,下面的代码该如何实现参数化设计的拉伸效果? namespace pt = TGPart; namespace fw = TGFramework; namespace fwp = TGFrameworkSupport; // 获取Application fw::Application* application = TGAddinTemplate1App::GetApplication(); // 获取PartDocumentPtr pt::PartDocumentPtr partDoc = application->Documents->Add("SolidEdge.PartDocument"); // 新建草图 pt::SketchsPtr pSketchs = partDoc->Sketches; pt::SketchPtr pSketch = pSketchs->Add(); // 参考平面 pt::RefPlanesPtr pRefPlanes = partDoc->RefPlanes; pt::RefPlanePtr pRefPlane = pRefPlanes->Item(1);//xoy // 获取轮廓 pt::ProfilePtr pProfile = pSketch->GetProfiles()->Add(pRefPlane); // 添加圆,圆心(0,0),半径0.2 fwp::Circles2dPtr pCircle2d = pProfile->Circles2d; pCircle2d->AddByCenterRadius(0, 0, 0.2); auto profileStatus = pProfile->End(TGPart::ProfileValidationType::igProfileClosed); // Create the extended protrusion. ATL::CComSafeArray<IDispatch*> aProfiles(1); aProfiles[0] = pProfile; //// 单侧拉伸,igRight右侧(即法向侧),igLeft 左侧(法向反方向侧) // 基于圆的轮廓做拉伸,拉伸方向为右侧,长度为0.2 pt::ModelPtr model = partDoc->Models->AddFiniteExtrudedProtrusion(1, aProfiles.GetSafeArrayPtr(), TGPart::FeaturePropertyConstants::igRight, 0.2); // 对称拉伸0.2,两边各拉伸0.1 pt::ModelPtr pModelScd = partDoc->Models->AddFiniteExtrudedProtrusion(1, aProfiles.GetSafeArrayPtr(), TGPart::FeaturePropertyConstants::igSymmetric, 0.2); // 非对称拉伸 法向侧拉伸0.3 法向侧反方向拉伸0.5 pt::RefPlanePtr pTopPlane = pRefPlanes->AddParallelByDistance(pRefPlane, 0.3, pt::igNormalSide); pt::RefPlanePtr pBottomPlane = pRefPlanes->AddParallelByDistance(pRefPlane, -0.5, pt::igNormalSide); _variant_t argTop(pTopPlane.GetInterfacePtr()); _variant_t argBot(pBottomPlane.GetInterfacePtr()); pt::ModelPtr pModelTrd = partDoc->Models->AddFiniteExtrudedProtrusion(1, aProfiles.GetSafeArrayPtr(), TGPart::FeaturePropertyConstants::igRight, 0, vtMissing, vtMissing, argTop, argBot);
最新发布
07-12
void qSlicerArielImplantPlanModuleWidgetPrivate::updateStemCutPlane() { Q_Q(qSlicerArielImplantPlanModuleWidget); if (curStemInfo.brand.empty() || curStemInfo.type.empty()) return; vtkNew<vtkMatrix4x4> stemPoseMatrix; stemPoseNode->GetMatrixTransformToParent(stemPoseMatrix); // 活动评估下 if (currentMode == qSlicerArielImplantPlanModuleWidgetPrivate::CollisionDetect) if (::isPoseValid(this->stemPoseMatrixRaw)) { stemPoseMatrix->DeepCopy(this->stemPoseMatrixRaw); } vtkNew<vtkMatrix4x4> identity; if (areMatricesEqual(stemPoseMatrix, identity)) return; double stemInfo[4]; stemInfo[0] = curStemInfo.neckLength; stemInfo[1] = curStemInfo.horizontalOffset; stemInfo[2] = curStemInfo.neckShaftAngle; stemInfo[3] = curStemInfo.cutAngle; // transform double origin[3], normal[3]; currentModuleLogic->getCutFemurPlaneOriginAndNormal(stemInfo, origin, normal); vtkNew<vtkPlane> stemCutPlane; currentModuleLogic->getTransformedPlane(origin, normal, stemPoseMatrix, stemCutPlane); stemCutPlane->GetOrigin(origin); stemCutPlane->GetNormal(normal); // Plane if (stemCutPlane && this->stemCutPlane) { std::cout << __FUNCTION__ << std::endl; //股骨柄切面高度 auto stemHeight = q->calculateCutFemurHeight(origin, normal); std::cout << u8"股骨柄切面高度:height=" << stemHeight << std::endl; //当前截骨面高度 auto distance = q->calculateCutFemurHeight(); std::cout << u8"矫正前截骨面高度:distance=" << distance << std::endl; //偏移=实际-理论 std::cout << u8"截骨偏移: cutPlaneOffset=" << cutPlaneOffset << std::endl; //高度or法向量 不相等:调节 if ((stemHeight + cutPlaneOffset) != distance) { //重置PlaneNode double newOrigin[3] = {0}; double newNormal[3] = {0}; memcpy(newNormal, normal, sizeof(double) * 3); if (cutPlaneOffset == 0.0) memcpy(newOrigin, origin, sizeof(double) * 3); else currentModuleLogic->calculatePositionOfCutPlaneByOffset(origin, normal, cutPlaneOffset, newOrigin); this->stemCutPlane->setPlaneNodeByPlaneType( PlaneType( {newNormal[0], newNormal[1], newNormal[2], newOrigin[0], newOrigin[1], newOrigin[2]}), this->cutPlaneRadius); //重置高度 q->resetCutFemurHeightSpinBoxValue(); //重新获取offset distance = q->calculateCutFemurHeight(); std::cout << u8"矫正后截骨面高度:distance=" << distance << ", stemHeight=" << stemHeight << std::endl; } } }
02-07
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值