Search the Community
Showing results for tags 'HDK'.
-
Hello, I started learning hdk. I need to find a nearest point, what the best way to do this? I have an example code in attachments. But it doesn't work as expected. Thanks sandDunes.cpp sandDunes.h
- 4 replies
-
- npt
- nearest point
-
(and 1 more)
Tagged with:
-
My First Try in Houdini HDK Customized the houdini file handler helper to accept custom paths. Python script integrated into Cpp to solve asset/shot logic. Still need to improvise a lot for production release . #houdini #hdk #c++ #python Cheers!!
-
Is it possible , and with the HDK? Coudl you talk about please? and if not why Sidefx doesn't make it possible, this makes total sense no to be able to export UI part of the Houdini proceduralism ? There are more artist asking for interactive tool in Unreal and Unity than in Houdini... Best regards and merry Xmas Everyone! vincent ________________________________________________________________ Vincent Thomas (VFX and Art since 1998) Senior Env and Lighting artist & Houdini generalist & Creative Concepts http://fr.linkedin.com/in/vincentthomas https://www.imdb.com/name/nm0859628/
-
Hi! Could anybody please share compiled version of houdini-geo-vox (https://github.com/ttvd/houdini-geo-vox) plugin for Houdini 18.5? I need a version for windows. Do you know any other methods to load MagicaVoxel files into Houdini? Regards, Oleg Solovjov
-
- voxel
- magicavoxel
-
(and 3 more)
Tagged with:
-
Greetings! I have recently started using the hdk to build a custom plug-in (which consist of a SOP Node that modify a heightfield) and I have encountered a deadend (actually more than one, but this forum provided me a lot of help ^^) In a few words, I am creating a SpareParm by getting the OP_Director (OPgetDirector()) and adding a PRM_Template with method addNodeSpareParm(). My issue is that if I provide a callback function, it is not called back (no result and in debug mode, any breakpoints in the callback function are never reached). I have no issue with parameters normally given when creating the node (I mean when using the newSopOperator() function, a button parameter call back its function correctly). To fully explain my process: I am creating a node with a path parameter (PRM_File) where I can provide a custom file. This custom file is read and depending on its content, I need to add parameters to the node. From my researches, SpareParms were the only approach suitable. Maybe I am wrong and I will be grateful if you can point me in the direction of a better method. For instance, this file could give me the parameter ‘width’ with a range and the node would create an integer parameter that would make possible to change the width of the input heightfield. But the SpareParms that are created do not seem to call the cookMySop() function when modified and adding a callback function that would use the forceRecook() function is not called (as explain above). Does this issue ring any bell? Thanks in advance Luc
-
I found an interesting Java snippet, which generates a large three-dimensional array. I would like to generate different variations of this and send it to Houdini for further processing. This 3D array barely fits into a single computer memory, so I would like to build a (bear with me) distributed system with a number of Java and Houdini nodes talking to each other via... gRPC. I am not awfully familiar with gRPC, but it looks like an ideal candidate due to performance. I don't imagine that Houdini supports it, but how would one go about implementing it with HDK?
-
Hello guys! I have a simple C++ code which should be used by VEX in Houdini. I need to access to geometry data in specific node from current frame till frame 1 in backward direction until certain condition is met. The problem is that this access cause a huge impact on runtime when using wetmap function in a point wrangle node! Here is the sample: #include <iostream> #include <VEX/VEX_VexOp.h> #include <OP/OP_Director.h> #include <GU/GU_Detail.h> #include <SOP/SOP_Node.h> #include <GEO/GEO_VolumeSampler.h> #include <GU/GU_PrimVolume.h> #include <GU/GU_SopResolver.h> #include <VM/VM_Math.h> #include <OP/OP_AutoLockInputs.h> template <VEX_Precision PREC> static void wetmap(int argc, void *argv[], void *) { VEXvec3<PREC> *resultCd = static_cast<VEXvec3<PREC>*>(argv[0]); const char *surfaceAddress = static_cast<const char *>(argv[1]); VEXvec3<PREC> *P = static_cast<VEXvec3<PREC>*>(argv[2]); VEXvec3<PREC> *Cd = static_cast<VEXvec3<PREC>*>(argv[3]); *resultCd = VEXvec3<PREC>{0, 1, 0}; SOP_Node *surfaceNode = OPgetDirector()->findSOPNode(surfaceAddress); exint currentFrame = CHgetFrameFromTime(CHgetEvalTime()); OP_Context context; VEXvec3<PREC> color{0, 0, 1}; if(surfaceNode != nullptr) { for (exint i = currentFrame; i > 0; --i) { context.setTime(CHgetTimeFromFrame(i)); GU_DetailHandle gd_handle = surfaceNode->getCookedGeoHandle(context); } } } void newVEXOp(void *) { using UT::Literal::operator""_sh; new VEX_VexOp("wetness@&VSVV"_sh, // Signature wetmap<VEX_32>, // Evaluator 32 wetmap<VEX_64> // Evaluator 64 ); } I also try to lock the referenced node input just like SOP node examples in HDK but it makes no difference! This is an image of use case: After couple of frames pointwrangle1 become slow to cook and I don't know why! Can anyone help me? Thanks in advance!
-
Youtube Dome: https://youtu.be/dr50dKeyD0Y Selling Link: https://gum.co/WdgZe FUNCTION: This SOP(support SOP compilable) can generate geodesic shortest between sources and targets, and both sources and targets can be points on faces(can be specified by primnum and primuv attribute) or just a point. Instruction and example file are also provided. USAGE INSTRUCTION: 1. When there is only one input, the input0 will be treat as both surface and source point 2. When there are two input, the input0 will be source points and input1 will be surface, and if toggle<uselocattrib> is off, then this sop will auotmatically calculate input0's closest points on the input1, and use these closest points to represent the input0's points and calculate the geodesic shortest path 3. If you want to use the "scatter" sop's attribute to specify the location on the input1, turn on the toggle<uselocattrib>, but make sure that the input1 has been triangulated, otherwise the location may be wrong. 4. This SOP will automatically triangulate and convex the surface geometry, then calculating. PROMISSING: If you have paid, you could get further update to support the latest production-ready houdini version for free from me (Houdini 18.5.499 or newer on Windows). if you have paid and there is any issue of installation and bugs, email me or comment on youtube(https://youtu.be/1M_91J7Th0M), you will get help. e-mail: ChildAdrianPan@gmail.com
- 2 replies
-
- 1
-
- compilable
- geodesic
-
(and 2 more)
Tagged with:
-
Youtube Dome: https://youtu.be/eUQsIatfFEE Selling Link: https://gum.co/QRpnO This SOP(Support SOP Compilable) provides a much better polygon offsetting algorithm with NO ERROR, compare to the intrinsic "polyexpand2d" SOP. And It also has more control of offsetting function. For example, it can treat input as individual polygons and offset them individually, or treat the input polygons as a whole. If you have paid, you could get further update to support the latest production-ready houdini version for free from me (Houdini 18.5.499 or newer on Windows). if you have paid and there is any issue of installation and bugs, email me or comment on youtube, you will get help. e-mail: ChildAdrianPan@gmail.com
-
- polygon offset
- clipper
-
(and 1 more)
Tagged with:
-
Youtube Dome: https://youtu.be/07wakho5z6o [youtu.be] Selling Link: https://gum.co/YHJgy [gum.co] This SOP(Support SOP Compilable) Provides 7 algorithms to simplify your polygons: { Nth Point, Radial Distance, Perpendicular Distance, Reumann Witkam, Opheim, Lang, Douglas Peucker N } with corresponding parameters in SOP Parameter Interface, and maintain the attributes at primitve and detail level. If you have paid, you could get further update to support the latest production-ready houdini version for free from me (Houdini 18.5.499 or newer on Windows). if you have paid and there is any issue of installation and bugs, email me or comment on youtube, you will get help. e-mail: ChildAdrianPan@gmail.com
-
- hdk
- polyline simplify
-
(and 1 more)
Tagged with:
-
I'm learning HDK and fluid sim by swapping out microsolver nodes in Houdini's built in FLIP solver. I've successfully changed the GasExternalForce node to my simple gravity node. It works okay but there's a small problem that bugs me a lot. So here's the implementation in the built in solver: There's a gravity node in the Auto DOP network (looks like the order doesn't really matter. I tried putting the gravity node before the flipsover and nothing changed.) And then in the flipsolver there's a GasExternalForces microsolver that apply forces on the particles. I deleted the gravity node and changed the GasExternalForces node to my implementation: bool SIM_HZExternalForce::solveGasSubclass(SIM_Engine &engine, SIM_Object *obj, SIM_Time time, SIM_Time timestep) { SIM_Geometry* geo = (SIM_Geometry*)obj->getGeometry(); if (!geo) { return false; } GU_DetailHandle gdh = geo->getOwnGeometry(); const GU_Detail* gdp_in = gdh.readLock(); // Must unlock later GU_Detail* gdp_out = gdh.writeLock(); GA_RWAttributeRef p_ref_vel = gdp_out->findPointAttribute("v"); GA_RWHandleT<UT_Vector3F> p_vel(p_ref_vel.getAttribute()); if (p_vel.isInvalid()) { return false; } for (GA_Iterator it(gdp_out->getPointRange()); !it.atEnd(); it.advance()){ int pid = it.getOffset(); UT_Vector3F vel = p_vel.get(pid); vel[1] -= timestep * 9.80665f; p_vel.set(pid, vel); } gdh.unlock(gdp_out); gdh.unlock(gdp_in); // Successful cook return true; } The problem is, the velocities in the first frame are all zero in the official implementation: But in my implementation, the velocities got changed in the first frame: I really want to know where this discrepancy comes from. Any suggestions? I've uploaded the source code and scene file if anyone is interested. GravityTest.zip
-
Hi, With the following code, I can write out a single bezier curve but anything more than one, the second bezier curves are not in the bgeo file being written out. The point count indicates that it is aware of additional points associated with the second curve. #include <string> #include <GU/GU_Detail.h> #include <GU/GU_PrimRBezCurve.h> #include <UT/UT_Version.h> #include <GEO/GEO_Point.h> #include <OpenEXR/ImathVec.h> #include <vector> typedef std::vector<Imath::V3d> V3dContainer; void create_single_bezier_curve(const std::string& bgeo_filename) { GU_Detail gdp; V3dContainer cvs; cvs.push_back(Imath::V3d(0,0,0)); cvs.push_back(Imath::V3d(1,1,0)); cvs.push_back(Imath::V3d(2,1,0)); cvs.push_back(Imath::V3d(3,0,0)); GA_Size num_points = cvs.size(); for ( size_t i = 0; i < num_points; ++i ) { GA_Offset pt = gdp.appendPointOffset(); gdp.setPos3(pt, cvs[i][0], cvs[i][1], cvs[i][2]); } GU_PrimRBezCurve* bezier_curve = GU_PrimRBezCurve::build(&gdp,num_points); if (bezier_curve) { for ( size_t i = 0; i < num_points; ++i ) { bezier_curve->setVertexPoint(i,gdp.pointOffset(i)); } gdp.save(bgeo_filename.c_str(), NULL); } } void create_multilpe_bezier_curves(const std::string& bgeo_filename) { GU_Detail gdp; V3dContainer cvs; // Curve 0 cvs.push_back(Imath::V3d(0,0,0)); cvs.push_back(Imath::V3d(1,1,0)); cvs.push_back(Imath::V3d(2,1,0)); cvs.push_back(Imath::V3d(3,0,0)); // Curve 1 double y_offset = 2.0; cvs.push_back(Imath::V3d(0,0 + y_offset,0)); cvs.push_back(Imath::V3d(1,1 + y_offset,0)); cvs.push_back(Imath::V3d(2,1 + y_offset,0)); cvs.push_back(Imath::V3d(3,0 + y_offset,0)); cvs.push_back(Imath::V3d(4,0 + y_offset,0)); // Store all the points GA_Size num_points = cvs.size(); for ( size_t i = 0; i < num_points; ++i ) { GA_Offset pt = gdp.appendPointOffset(); gdp.setPos3(pt, cvs[i][0], cvs[i][1], cvs[i][2]); } // Setup curve 0 GA_Size num_points_curve_0 = 4; GU_PrimRBezCurve* bezier_curve_0 = GU_PrimRBezCurve::build(&gdp,num_points_curve_0); if (bezier_curve_0) { for ( size_t i = 0; i < num_points_curve_0; ++i ) { bezier_curve_0->setVertexPoint(i,gdp.pointOffset(i)); } } // Setup curve 1 GA_Size num_points_curve_1 = 5; GA_Offset curve_offset_1 = 4; // because the first 4 points is for curve 0 GU_PrimRBezCurve* bezier_curve_1 = GU_PrimRBezCurve::build(&gdp,num_points_curve_1); if (bezier_curve_1) { for ( size_t i = 0; i < num_points_curve_1; ++i ) { bezier_curve_1->setVertexPoint(i,gdp.pointOffset(i+curve_offset_1)); // bezier_curve_1->setVertexPoint(i,curve_offset_1); } } gdp.save(bgeo_filename.c_str(), NULL); } int main(int argc, char *argv[]) { create_single_bezier_curve("single_bezier_curve.bgeo"); create_multilpe_bezier_curves("multiple_bezier_curves.bgeo"); return 0; }
-
Hello, devs, I have compiled geoisosurface.C but running geoisosurface.exe raise an error: Entry Point Not Found. The procedure entry point gzdirect could not be located in the dynamic link library C:\Program Files\Side Effects Software\Houdini 18.0.460\bin\libxml2.dll If I place geoisosurface.exe into the Houdini bin folder it is working and produce me sphere.bgeo. If I copy libxml2.dll to the folder with exe file the error is: The procedure entry point gzdirect could not be located in the dynamic link library D:/path_to_geoisosurface/libxml2.dll I am pretty sure that exe file should work outside Houdini bin dir, but have no idea how to fix this. Alex @Stalkerx777, anything comes into mind?
-
I am trying to resurrect an old version of a Houdini plugin that no longer works with newer versions of Houdini. I've tracked down the issue to a segfault happening in the file $HFS/toolkit/include/openvdb/Grid.h , where the function Grid<TreeT>::setTree(TreeBase::Ptr tree) is checking the type of the tree: tree->type() I can't figure out what could be causing this to segfault. When I print ouf the tree details with tree->print(std::cout, 4) I see that the tree type is "Tree_float_5_4_3", which seems fine? So why would this cause an issue? Anyone have any ideas? The full print output is: Information about Tree: Type: Tree_float_5_4_3 Configuration: Root(1 x 1), Internal(1 x 32^3), Internal(6 x 16^3), Leaf(5,207 x 8^3) Background value: 0 Min value: 0 Max value: 15.9799 Number of active voxels: 4,927,500 Number of active tiles: 5,813 Bounding box of active voxels: [0, 0, 0] -> [299, 224, 72] Dimensions of active voxels: 300 x 225 x 73 Percentage of active voxels: 100% Average leaf node fill ratio: 73.2% Number of unallocated nodes: 0 (0%) Memory footprint: Actual: 11.099 MB Active leaf voxels: 7.443 MB Dense equivalent: 18.797 MB Actual footprint is 59% of an equivalent dense volume Leaf voxel footprint is 67.1% of actual footprint Tree_float_5_4_3
-
Hello, I am trying to start Learning Houdini HDK so i started by compiling the sample files. I managed to compile with hcustom, everything worked fine so i tried with cmake. generating the project worked but when i open the solution file in visual studio and i build i get a lot of errors saying impossible to initialize member "....". I'm on Windows 10 i use Houdini 17.5.425 and visual studio Community 15 2017 and cmake 3.18. Any ideas why i get all these errors ? should I upgrade to Houdini 18 ? I can work with hcustom for now because i'm just Learning but I would be very happy to undertand why it doesnt work. Thanks !
-
ACM Transactions on Graphics "Generalized non-reflecting boundaries for fluid re-simulation" How do I build the HDK for this paper? website: http://alas.dk/publications/2016/GNRBfFRS/ Download HDK Source Code: http://pub.ist.ac.at/group_wojtan/projects/2016_Bojsen-Hansen_GNRBfFRS/2016_Bojsen-Hansen_GNRBfFRS.zip I tried halfway through with Visual Studio 2015 and it looked like I could build with Houdini 17.0, but I got so many errors with Houdini 18. I'm a beginner in programming, but I'm very interested in the HDK for this paper and would like to install it on Houdini. Thank you.
-
Hello, I'd like to perform matrix multiplication between 2 of 3x3 matrices(not coefficient-wise) and outer product between 2 vectors using HDK. So I'd like to know if the * operator supports matrix multiplication and outer product of vectors as in the example code below. UT_Matrix3 A = ... UT_Matrix3 B = ... UT_Matrix3 C = A * B // matrix multiplication UT_Vector3 u = ... UT_Vector3 v = ... UT_Matrix3 X = u * v // outer product If not, is there a function/operator to do matrix multiplication and outer product? Thank you.
-
hello everyone,i'm learning c++ and I'm new to Houdini HDK. I was reading another topic, someone told that you can use example files and manipulate them. so I have some questions for you: as you can see the header code and it's definition namespace HDK_Sample { /// Run a sin() wave through geometry by deforming points /// @see @ref HOM/SOP_HOMWave.C, SOP_HOMWave, SOP_CPPWave class SOP_PointWave : public SOP_Node { public: SOP_PointWave(OP_Network *net, const char *name, OP_Operator *op); virtual ~SOP_PointWave(); static PRM_Template myTemplateList[]; static OP_Node *myConstructor(OP_Network*, const char *, OP_Operator *); /// This method is created so that it can be called by handles. It only /// cooks the input group of this SOP. The geometry in this group is /// the only geometry manipulated by this SOP. virtual OP_ERROR cookInputGroups(OP_Context &context, int alone = 0); protected: /// Method to cook geometry for the SOP virtual OP_ERROR cookMySop(OP_Context &context); private: void getGroups(UT_String &str){ evalString(str, "group", 0, 0); } fpreal AMP(fpreal t) { return evalFloat("amp", 0, t); } fpreal PHASE(fpreal t) { return evalFloat("phase", 0, t); } fpreal PERIOD(fpreal t) { return evalFloat("period", 0, t); } /// This is the group of geometry to be manipulated by this SOP and cooked /// by the method "cookInputGroups". const GA_PointGroup *myGroup; }; using namespace HDK_Sample; void newSopOperator(OP_OperatorTable *table) { table->addOperator(new OP_Operator( "hdk_pointwave", "Point Wave", SOP_PointWave::myConstructor, SOP_PointWave::myTemplateList, 1, 1, 0)); } static PRM_Name names[] = { PRM_Name("amp", "Amplitude"), PRM_Name("phase", "Phase"), PRM_Name("period", "Period"), }; PRM_Template SOP_PointWave::myTemplateList[] = { PRM_Template(PRM_STRING, 1, &PRMgroupName, 0, &SOP_Node::pointGroupMenu, 0, 0, SOP_Node::getGroupSelectButton( GA_GROUP_POINT)), PRM_Template(PRM_FLT_J, 1, &names[0], PRMoneDefaults, 0, &PRMscaleRange), PRM_Template(PRM_FLT_J, 1, &names[1], PRMzeroDefaults), PRM_Template(PRM_FLT_J, 1, &names[2], PRMoneDefaults), PRM_Template(), }; OP_Node * SOP_PointWave::myConstructor(OP_Network *net, const char *name, OP_Operator *op) { return new SOP_PointWave(net, name, op); } SOP_PointWave::SOP_PointWave(OP_Network *net, const char *name, OP_Operator *op) : SOP_Node(net, name, op), myGroup(NULL) { mySopFlags.setManagesDataIDs(true); } SOP_PointWave::~SOP_PointWave() {} OP_ERROR SOP_PointWave::cookInputGroups(OP_Context &context, int alone) { return cookInputPointGroups( context, // This is needed for cooking the group parameter, and cooking the input if alone. myGroup, // The group (or NULL) is written to myGroup if not alone. alone, // This is true iff called outside of cookMySop to update handles. // true means the group will be for the input geometry. // false means the group will be for gdp (the working/output geometry). true, // (default) true means to set the selection to the group if not alone and the highlight flag is on. 0, // (default) Parameter index of the group field -1, // (default) Parameter index of the group type field (-1 since there isn't one) true, // (default) true means that a pointer to an existing group is okay; false means group is always new. false, // (default) false means new groups should be unordered; true means new groups should be ordered. true, // (default) true means that all new groups should be detached, so not owned by the detail; // false means that new point and primitive groups on gdp will be owned by gdp. 0 // (default) Index of the input whose geometry the group will be made for if alone. ); } OP_ERROR SOP_PointWave::cookMySop(OP_Context &context) { OP_AutoLockInputs inputs(this); if (inputs.lock(context) >= UT_ERROR_ABORT) return error(); duplicatePointSource(0, context); fpreal t = context.getTime(); float phase = PHASE(t); float amp = AMP(t); float period = PERIOD(t); if (error() >= UT_ERROR_ABORT) return error(); if (cookInputGroups(context) >= UT_ERROR_ABORT) return error(); GA_Offset ptoff; GA_FOR_ALL_GROUP_PTOFF(gdp, myGroup, ptoff) { UT_Vector3 p = gdp->getPos3(ptoff); p.y() += SYSsin( (p.x() / period + phase) * M_PI * 2 ) * amp; gdp->setPos3(ptoff, p); } if (!myGroup || !myGroup->isEmpty()) gdp->getP()->bumpDataId(); return error(); } my first question is: we have this int header file : SOP_PointWave(OP_Network *net, const char *name, OP_Operator *op); where is it's definition in *.c file? ----------------------------------------------------------------------------------------------------------------------------------------- my second question is: void newSopOperator(OP_OperatorTable *table) { table->addOperator(new OP_Operator( "hdk_pointwave", "Point Wave", SOP_PointWave::myConstructor, SOP_PointWave::myTemplateList, 1, 1, 0)); } why this function is void? I know because it won't return anything, but why it shouldn't? why newSopOperator's parameter is a class (i know a class is custom data type) but why? and what is table in the parameter? ----------------------------------------------------------------- BEST REGARDS
-
Hello, guys! For example, I have a button with a callback function and some float value: PRM_Template(PRM_CALLBACK, 1, &someBtnName, 0, 0, 0, &callbackFunc), PRM_Template(PRM_FLT, TOOL_PARM, 1, &someValueName, PRMzeroDefaults), ... int callbackFunc(void *data, int index, fpreal t, const PRM_Template *tplate) { ... } How to change value of a float control from the callbackFunc function?
-
Hello, I'm working on a big project which uses 3rd party library and I get some strange results if I try to interrupt my nodes. At first i thought that I'm doing something wrong and UT_AutoInterrupt send to callback of this library is not working properly, so I took example node that comes with Houdini SOP_Flatten, removed almost all code from cookMySop() and tried to interrupt it. This is what I get: There should be only Warning set. But I do get additional Error. And I don't know from where it come from. This is the code I have in cookMySOp(): OP_ERROR SOP_Flatten::cookMySop(OP_Context &context) { OP_AutoLockInputs inputs(this); if (inputs.lock(context) >= UT_ERROR_ABORT) return error(); auto progress = UT_AutoInterrupt(""); for (auto i = 0; i < 10000; i++) { if (progress.wasInterrupted()) { this->addWarning(SOP_MESSAGE, "Test interrupted."); return error(); } std::cout << "YAY: " << i << "\n"; } return error(); } Anybody knows why I do get this additional Error state when interrupting the node? I'm on H18.0.348.
-
hello, nowadays I'm working on Houdini HDK I created a discord server to help each other this is the discord's link: https://discord.gg/RtNRscp and this is my blog:https://aminkhormaei1.wixsite.com/base i put solutions inside my blog. please share this post, maybe your friends are into developing a plugin for Houdini BEST REGARDS
-
Hi, I want to start learning the hdk and by creating simple standalone application. I managed to get the example of the docs compiling and it is creating a sphere so everything is fine. For that, I was using a simple console application. But as soon as I add the Qt5 Core library so I can create my interface, it's not compiling anymore, if I don't include the library in my main file. Here is my error: undefined reference to `QApplication::setCustomDPIOverride(int)@Qt_5 This is in libHoudiniUI.so Does any of you have any idea of what can causes this? edit: For those of you who are interesteed, I managed to recently find the solution. I didn't have the exact same version of Qt as Houdini is using, and also there was some issues with cmake file
-
I wrote an article that is probably only of interest for the .1% It is a crash introduction to HDK, C++ and the mesh laplacian. https://mbaadsgaard.com/portfolio/laplacian-eigenvector-plugin-for-houdini/ Feedback is, of course, also welcome
-
So I'm still building some microsolver nodes for water simulation. I noticed that all the microsolver I made including the Gas Add from the HDK sample all have a grey input point on the left. All built-in in gas node do not. Seems like this doesn't effect the execution result but I'm still curious how do I make a node that looks exactly like the built-in ones. And also, enable bypass on these nodes doesn't seem to work. Do I need to manually skip in solveGasSubclass()?
-
Hi everyone! I've made an illustration video-tutorial about the Heat Method application to point clouds by Keenan Crane et al, Yang Liu et al and others.