felipunkerito Posted September 22, 2017 Share Posted September 22, 2017 (edited) Hi guys, I was following along a tutorial and wanted to implement the VOP's I got into VEX but for some reason I cant sort this bug out. This is inside an attribute wrangle after pop collision: vector center, newVect, Cd1; if(1==0){ //@P.y = noise(@P); }else{ for(int i = 0; i<chi("Ripples"); i++){ Cd1 = @Cd; vector PTemp = @P; offset = @Time; freq = ch("Frequency"); ampli = ch("Amplitude"); center = @hitpos; dist = distance(PTemp, center); trig = ampli * sin(dist * freq + offset); if(@Cd=={1,0,0}){ newVect = setcomp(PTemp, trig, 1); fVal = getcomp(@Cd, 0); //@P.y = lerp(@P, newVect, fVal); //@P.y = blend; @P.y = lerp(PTemp, trig, fVal); @P.y*=i; } } } and this is what the attribute VOP created in CVRipplesPro.hipEX: // Code produced by: distance1 dist = distance(P1, hitpos); // Code produced by: input2 input21 = 12.699999999999999; // Code produced by: multiply1 product = dist * input21; // Code produced by: sine1 sine = vop_sin(product); // Code produced by: multiply2 product1 = input2 * sine; // Code produced by: vecsetcompon1 newvec = vop_setcomp(P1, product1, 1); // Code produced by: vecgetcompon1 fval = vop_getcomp(Cd1, 0); // Code produced by: mix1 #ifdef __vex blend = lerp(P1, newvec, fval); #else blend = mix(P1, newvec, fval); #endif // Code produced by: geometryvopoutput1 vector _P = blend; vector _v = vector(); vector _force = vector(); vector _Cd = vector(); vector _N = vector(); { // Code produced by: geometryvopoutput1/P P = _P; } } Edited September 22, 2017 by felipunkerito Quote Link to comment Share on other sites More sharing options...
f1480187 Posted September 22, 2017 Share Posted September 22, 2017 @hitpos accessed as float, as the major problem with this. If you want to translate VOP to wrangle code, you could add Snippet VOP and gradually delete other VOP nodes using equivalent VEX functions in Snippet code. In the end, after you will have only the Snippet and its parameters, you could copy-paste code to fresh wrangle and setup parameter interface. Quote Link to comment Share on other sites More sharing options...
felipunkerito Posted September 22, 2017 Author Share Posted September 22, 2017 (edited) Thanks! But nope it isnt that, I have declared center as a vector, or is it that the vector data type differs from the 3floats(vector) datatype that I have inside the attribute VOP? I have tried everything and it doesnt seem a logic error to me, seems that VOP's vop_getcomp and vop_setcomp are not the same as setcomp() and getcomp(). I do not want to refactor it in a snippet, I will like to have a point or attribute wrangle outside the vop attribute, although not a bad idea Edited September 22, 2017 by felipunkerito Quote Link to comment Share on other sites More sharing options...
felipunkerito Posted September 22, 2017 Author Share Posted September 22, 2017 Ive done it as you said so and I still encounter even heavier bugs using this method, although the snippet is working inside the VOP attribute, when taken out and used as point wrange or so, it doesnt work for the center to the edge of every collision. Here I attach the file, guess I will just stick to using the snippet for any wrangling I need, if somebody comes across a solution that allows for a normal point or attribute wrangle that be nice. RipplesPro.hip Quote Link to comment Share on other sites More sharing options...
f1480187 Posted September 23, 2017 Share Posted September 23, 2017 (edited) vop_getcomp is exactly same function, but vop_setcomp is actually different, it returns result rather than writing it in-place. Didn't know it myself. Check in $HFS/houdini/vex/include/voplib.h We don't use this functions in wrangles, better code equivalent is "@P.y = some_value". Make yourself familiar with this guide: http://www.sidefx.com/docs/houdini/vex/snippets It covers most of the problems you encountered. Of course, if something is unclear, feel free to ask any questions. Check the fixed version of your code: ripples_fix.hipnc Edited September 23, 2017 by f1480187 Quote Link to comment Share on other sites More sharing options...
felipunkerito Posted September 23, 2017 Author Share Posted September 23, 2017 (edited) Thanks! How do I relate this to normals so that I can apply it to not planar surfaces. I have tried and sort of succeeded with setting an up vector and added as vector up = {0,1,0}; wrangle = exp(-decay * dist) * sin(dist * freq + offset) * ampl; @P +=up * wrangle; Edited September 23, 2017 by felipunkerito Quote Link to comment Share on other sites More sharing options...
f1480187 Posted September 24, 2017 Share Posted September 24, 2017 Well, I would try to use @N instead of up. Quote Link to comment Share on other sites More sharing options...
felipunkerito Posted September 24, 2017 Author Share Posted September 24, 2017 Excellent! Quote Link to comment Share on other sites More sharing options...
felipunkerito Posted September 24, 2017 Author Share Posted September 24, 2017 I have been trying to access v@opinput1_P with no luck any suggestions? Quote Link to comment Share on other sites More sharing options...
f1480187 Posted September 24, 2017 Share Posted September 24, 2017 @felipunkerito, without scene it is not possible to help you. Quote Link to comment Share on other sites More sharing options...
felipunkerito Posted September 25, 2017 Author Share Posted September 25, 2017 As you can see I was trying to grab the point through the attribute wrangle and trying to drive the sine wave from there to the points of the object, but v@opinput1_P doesnt define the position of the already "picked up" group. thanks! Acids.hip Quote Link to comment Share on other sites More sharing options...
f1480187 Posted September 25, 2017 Share Posted September 25, 2017 I can see @opinput2_P (third input's @P) and third input is empty. In the initial version I saw you used some particle hits as ripple centers, but now it is either default (three zeros) vector for non-existing input (distance between @P and zero vector will always be 1 on unit sphere) or each point of second input (10 000 ripple centers? distance will be zero always). If you want to leave 1 point, you should use Blast node. If you need first point's P from second input, use point(1, "P", 0) (numeration starting from zero). @opinput variables has the same meaning as ones without word "opinput", and you usually use it when the topology of second input is same. Expression equivalent to "@opinput1_P" is "point(1, "P", @ptnum)". Just rewrite the wrangle from scratch, step-by-step, and make sure your variables store proper values. Visualize values as attributes. Bugs like "values are always zero" will pop up. Quote Link to comment Share on other sites More sharing options...
felipunkerito Posted September 25, 2017 Author Share Posted September 25, 2017 (edited) Yes, the other file is done, everything works as expected. What I am looking for in this one is to extract the vector from the initial geometry through an attribute wrangle by selecting the point by number, so that I can specify through the second input of the point wrangle the input of the center of the sine wave, if I am not being extremely confusing, thanks! I have tried using blast with no luck, as it does not change the sine center when changing the number of the group in the blast node. Edited September 25, 2017 by felipunkerito Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.