LDraw.org Discussion Forums
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)

Pages: 1 2


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 Smile

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:

Code:
local center=ldc.vector(10, 0, 10) --some alternative center.
local rotation=ldc.matrix()
rotation:setRotate(45, 0, 1, 0) --e.g 45 deg rotate around y

--build transformation matrix
local matrix=ldc.matrix()
matrix:setTranslate(center:getInverted())
matrix:mulAB(rotation)
matrix:mulTranslateAB(center)

--Apply it to brick(s), e.g the first one in the model
local ref=ldc.subfile():getRef(1)
local refMatrix=ref:getPosOri()
refMatrix:mulAB(matrix)
ref:setPosOri(refMatrix)

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?



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?

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.


I have a different approach for the rotation around any center which seems to be much shorter:
Code:
local angle=23                     --rotation angle
local centerPart=ref.getPos()             --center of part/group to be rotated
local centerRot=ldc.vector(2,3,4)        --Vector of rotation center
local centerPartRel=centerPart-centerRot     --relative position of part/group center from rotation Center
                
ref:mulRotateAB(angle,1,0,0)            --rotates the part/group itself around the x-axis of his center
centerPartRel.transform(ref.getOri())        --makes a transformation to the relative position with the new orientation
ref:setPos(centerPartRel+centerRot)        --sets the new position as vector-sum of rotation center and transformed relative position vector



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())
Therefore I introduces the 'indipendent orientation'.


So, here is the code:
Code:
function rotaround(refPart,centerRot,indOri,angle,rotVec)
    --refPart: refline object/group
    --centerRot: vector to rotation center
    --indOri: indipendent orientation matrix
    --angle: angle of rotation in degrees
    --rotVec: vector to rotate around
    local centerPartRel=refPart:getPos()-centerRot --relative position of part/group center from rotation Center
    local refPartOri=refPart:getOri()
    refPartOri:mulRotateAB(angle,rotVec) --rotates the part/group itself around the x-axis of his center
    centerPartRel:transform(indOri) --makes a coordinate transformation to the relate Position
    refPart:setPos(centerPartRel+centerRot)    --sets the new position as vector-sum of rotation center and transformed relative position vector
    refPart:setOri(refPartOri)
    return refPart:getPosOri()
end