![]() |
mathematical functions for scripting in LDCad - Printable Version +- LDraw.org Discussion Forums (https://forums.ldraw.org) +-- Forum: LDraw Programs (https://forums.ldraw.org/forum-7.html) +--- Forum: LDraw Editors and Viewers (https://forums.ldraw.org/forum-11.html) +--- Thread: mathematical functions for scripting in LDCad (/thread-22756.html) |
mathematical functions for scripting in LDCad - Joscha - 2018-03-14 Hi Is there any overview on the mathematical functions included in the scripting language of LDCad? Does it include algebraic operations (Matrices)? Is it possible to add such libraries? Regards Joscha RE: mathematical functions for scripting in LDCad - Jarema - 2018-03-14 According to Scripting API documentation. LDCad have module match included described here http://lua-users.org/wiki/MathLibraryTutorial. RE: mathematical functions for scripting in LDCad - Joscha - 2018-03-14 (2018-03-14, 9:07)Jarema Wrote: According to Scripting API documentation. LDCad have module match included described here http://lua-users.org/wiki/MathLibraryTutorial. Hi Jarema Thank you for yor quick answer and sorry for being blind. It is quite obvious on the LDCad homepage. It doesn't seem to support algebraic functions. RE: mathematical functions for scripting in LDCad - Roland Melkert - 2018-03-14 (2018-03-14, 16:57)Joscha Wrote: It doesn't seem to support algebraic functions. The default lua math library is very limited, but the beauty of a scripting language is you can extend it with the things you need. Ether by using a thirdparty library or by writing one your self. If all you need is matrix and vector math I did add support for that through the ldc module as LDraw is heavily depended on matrix math. But the ldc matrix math is highly targeted on LDraw usage, so if you need more complicated things you might need to use something like: https://github.com/anaef/lua-linear But this would require you to compile a .dll (window) or .so (Linux). There might also be a pure lua module for this out there, but I couldn't find it during a quick web search. If you go the compile route be sure to match the main executable 32 or 64 bit wise. And use the lua 5.3 headers. RE: mathematical functions for scripting in LDCad - Joscha - 2018-03-14 (2018-03-14, 18:33)Roland Melkert Wrote: If all you need is matrix and vector math I did add support for that through the ldc module as LDraw is heavily depended on matrix math. Hi Roland Yes, all I need is vector and matrix math. My problem is, I would like to rotate a part and I would like to know (or use it in the script) the new position of a specific point of this part. This would usually be a simple coordinate system rotation multiplying a vector with the rotation matrix. The most suitable command seems to be 'transform'. Only somehow it does not behave fully like this. It seems to flip my part by 180°. Furthermore, is there any way to access the location of the parts center? I mean the rotation matrix always rotates a part around its center. If I like to rotate it around another center during a script I would have to rotate and translate it. This seems to be confusing. RE: mathematical functions for scripting in LDCad - Roland Melkert - 2018-03-14 (2018-03-14, 22:15)Joscha Wrote: Hi Roland Keep in mind the LDraw coordinate system uses a negative Y while OpenGL does not. I correct for this by using a base model view rotation of 180 degrees. To rotate around another center you do indeed need to apply a translate, like so: Code: local center=ldc.vector(10, 0, 10) --some alternative center. I know it's not very efficient but, if it would need to be really fast you wouldn't be using script ![]() You could wrap the matrix construction in a function if you worried about readability etc. To find the abs position of point in the part you need to use Code: someVectorWithPositionRelativeToBrickRefIsLinkedTo:transform(refMatrix) RE: mathematical functions for scripting in LDCad - Joscha - 2018-03-15 I figured out why I experienced the 180° flip. I just applied the rotation to the wrong orientation matrix. But basically I learned now that everything I need is already packed inside the scripting API. Thank you! Coming back to the matrix type. You describe that it is a 4x4 matrix initialised as identity matrix. But for the location and orientation only 12 elements are used. Do the four remaining elements contain information? RE: mathematical functions for scripting in LDCad - Roland Melkert - 2018-03-15 (2018-03-15, 14:05)Joscha Wrote: Coming back to the matrix type. You describe that it is a 4x4 matrix initialised as identity matrix. But for the location and orientation only 12 elements are used. Do the four remaining elements contain information? The 12 elements are what is used in LDraw "type 1" lines. It's a position and 3x3 rotation matrix. Internally this is stored in a 4x4 matrix but one column (or row depending how you look at it) is (or should be) always 0 0 0 1 as it assumes the matrices only contain a rotation and translation. ps: I noticed an error in my code which works only because of a fluke: Code: local matrix=ldc.matrix() Code: local matrix=ldc.matrix() RE: mathematical functions for scripting in LDCad - Jarema - 2018-03-16 As with another pool of questions. Because I have never been strong... in mathematics. I ask how to determine the angle of inclination of a given part with respect to a given axis ? RE: mathematical functions for scripting in LDCad - Joscha - 2018-03-16 (2018-03-15, 18:13)Roland Melkert Wrote: Indeed, I thought about why using mulAB once with a matrix once with a vector, but I didn't dare to ask ![]() I just stumbled over the center:getInverted(). In your manual getInverted is for matrices. What does it do with the vector? RE: mathematical functions for scripting in LDCad - Joscha - 2018-03-16 (2018-03-16, 9:08)Jarema Wrote: As with another pool of questions. Because I have never been strong... in mathematics. I ask how to determine the angle of inclination of a given part with respect to a given axis ? Do you mean the angle between the orientation of a part/group and any vector? Isn't it 'getAngle'? RE: mathematical functions for scripting in LDCad - Jarema - 2018-03-16 How calculate the angle of Technic Axle 6 relative to the Y axis. See attached file. RE: mathematical functions for scripting in LDCad - Roland Melkert - 2018-03-16 (2018-03-16, 17:15)Jarema Wrote: How calculate the angle of Technic Axle 6 relative to the Y axis. See attached file. Axles point into their local X direction, so... Take a vector of 1 0 0 Transform it by the axles rotation ( :getRef, :getOri) Take a vector of abs Y (0 -1 0) Get the angle between the two by absYVector:getAngle(absAxleXVector) Hope this get you on the right path. ps: I'm assuming you need this for scripting, during editing you better off using the selection information feature. RE: mathematical functions for scripting in LDCad - Joscha - 2018-03-17 (2018-03-16, 9:08)Jarema Wrote: As with another pool of questions. Because I have never been strong... in mathematics. I ask how to determine the angle of inclination of a given part with respect to a given axis ? Hi Jarema From the mathematical point of view the angle between two vectors is determined by angle=acos( vecA*vecB / abs(vecA) / abs(vecB) ) Sorry, I wanted to post a formula, but for some reason I couldn't post the image. RE: mathematical functions for scripting in LDCad - Jarema - 2018-03-17 I discovered Today, that genTools.lua in default\modules have triangleAngle and trianglePlacementAngles. I hope that this module will be regularly enriched with new, stand-alone functions RE: mathematical functions for scripting in LDCad - Roland Melkert - 2018-03-17 (2018-03-17, 17:31)Jarema Wrote: I discovered Today, that genTools.lua in default\modules have triangleAngle and trianglePlacementAngles. I hope that this module will be regularly enriched with new, stand-alone functions I added those because I needed them in multiple example animations ![]() trianglePlacementAngles basiclly does what the option in the selection information menu does. RE: mathematical functions for scripting in LDCad - Joscha - 2018-03-25 (2018-03-14, 23:55)Roland Melkert Wrote: To rotate around another center you do indeed need to apply a translate, like so: RE: mathematical functions for scripting in LDCad - Roland Melkert - 2018-03-25 (2018-03-25, 9:12)Joscha Wrote: Roland, I have to come back to your code above. I applied it successfully. Thank you! But I do not understand the getInverted command. How to invert a vector? The command should be only for matrices, shouldn't it? getInverted only flips the signs of xyz, so e.g. (1,-2,3) returns (-1,2,-3). I named it inverted as its goal is the same, to "undo" the vectors content (1+ -1 = 0) just as an inverted matrix can be used to get identity back when multiplying with the original. RE: mathematical functions for scripting in LDCad - Joscha - 2018-03-26 (2018-03-25, 17:31)Roland Melkert Wrote:(2018-03-25, 9:12)Joscha Wrote: Roland, I have to come back to your code above. I applied it successfully. Thank you! But I do not understand the getInverted command. How to invert a vector? The command should be only for matrices, shouldn't it? I have a different approach for the rotation around any center which seems to be much shorter: Code: local angle=23 --rotation angle RE: mathematical functions for scripting in LDCad - Joscha - 2018-03-29 In my code were small errors. I corrected them and put it into a function for those who are interested in rotating parts around an arbitrary center. If you perform multiple rotations to one part you should not use the orientation of the reference itself as shown in my last reply: Code: centerPartRel.transform(ref.getOri()) So, here is the code: Code: function rotaround(refPart,centerRot,indOri,angle,rotVec) |