Community
Mudbox Forum
Welcome to Autodesk’s Mudbox Forums. Share your knowledge, ask questions, and explore popular Mudbox topics.
cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Question about SDK

12 REPLIES 12
SOLVED
Reply
Message 1 of 13
haikalle2771
859 Views, 12 Replies

Question about SDK

haikalle2771
Contributor
Contributor

Hi! I have an idea for mudbox plugin and I use CurveBrush plugin as a base code. My goal is to modify the code that I could start to make the stroke every in 3d space not only when cursor is located under the mesh. Is this possible? 

Question about SDK

Hi! I have an idea for mudbox plugin and I use CurveBrush plugin as a base code. My goal is to modify the code that I could start to make the stroke every in 3d space not only when cursor is located under the mesh. Is this possible? 

12 REPLIES 12
Message 2 of 13

Christoph_Schaedl
Mentor
Mentor

in mudbox a stroke does start outside of a mesh.

try the grab brush if you start outside and move inwards it will push the geo inwards as soon as you touch the mesh.

----------------------------------------------------------------
https://linktr.ee/cg_oglu

in mudbox a stroke does start outside of a mesh.

try the grab brush if you start outside and move inwards it will push the geo inwards as soon as you touch the mesh.

----------------------------------------------------------------
https://linktr.ee/cg_oglu
Message 3 of 13

haikalle2771
Contributor
Contributor

Thanks for the reply. I have this idea to make the simple 2d paint sketching plugin inside into mudbox. Very often when I sculpt, I take a screenshot and take that picture into 2d painting app. Do some rough sketching and trying to find ideas for sculpting. I thought that it would be nice to code this feature into mudbox using SDK. But like you said it seams that there is no way to start a stroke outside the mesh.

 

I was just thinking that there is tools like "Curve loop" where you can start to create a visual guide outside the mesh. Could I do something similar with SDK? 

0 Likes

Thanks for the reply. I have this idea to make the simple 2d paint sketching plugin inside into mudbox. Very often when I sculpt, I take a screenshot and take that picture into 2d painting app. Do some rough sketching and trying to find ideas for sculpting. I thought that it would be nice to code this feature into mudbox using SDK. But like you said it seams that there is no way to start a stroke outside the mesh.

 

I was just thinking that there is tools like "Curve loop" where you can start to create a visual guide outside the mesh. Could I do something similar with SDK? 

Message 4 of 13
Anonymous
in reply to: haikalle2771

Anonymous
Not applicable

Drawing on the screen in 2D is completely different from drawing on a 3d scene object.

A common way to do what you're talking about is called "projection". Where you draw on the screen in 2D. And then it gets projected onto the mesh's surface.

AFAIK, there is no such projection option in the Mudbox SDK. But I have not touched it in years. So that might not be true anymore.

This question is exactly why I lobbied for "At least some small level of SDK support".

This question could be answered very simply and quickly by one of the developers.

 

-ScottA

Drawing on the screen in 2D is completely different from drawing on a 3d scene object.

A common way to do what you're talking about is called "projection". Where you draw on the screen in 2D. And then it gets projected onto the mesh's surface.

AFAIK, there is no such projection option in the Mudbox SDK. But I have not touched it in years. So that might not be true anymore.

This question is exactly why I lobbied for "At least some small level of SDK support".

This question could be answered very simply and quickly by one of the developers.

 

-ScottA

Message 5 of 13
imre.major
in reply to: haikalle2771

imre.major
Alumni
Alumni
Accepted solution

Hi. Both the functions CurveCreator::BeginStroke and CurveCreator::MouseMove should be called even before the cursor reach the mesh. Did you try putting a breakpoint to either of those, and see if they are called when you press the mouse button while the cursor is not on the mesh?

Hi. Both the functions CurveCreator::BeginStroke and CurveCreator::MouseMove should be called even before the cursor reach the mesh. Did you try putting a breakpoint to either of those, and see if they are called when you press the mouse button while the cursor is not on the mesh?

Message 6 of 13
haikalle2771
in reply to: imre.major

haikalle2771
Contributor
Contributor

Thanks a lot. I even didn't know that I can debug plugins while mudbox is running. I tried and it worked perfectly. This really helps a lot. And yes it seams that brushstroke is called even if cursor is not touching the mesh so I will gladly continue to code plugin idea what I have 🙂

0 Likes

Thanks a lot. I even didn't know that I can debug plugins while mudbox is running. I tried and it worked perfectly. This really helps a lot. And yes it seams that brushstroke is called even if cursor is not touching the mesh so I will gladly continue to code plugin idea what I have 🙂

Message 7 of 13
haikalle2771
in reply to: haikalle2771

haikalle2771
Contributor
Contributor

Things are looking good, but still needs some helps. So my goal is to take screen space coords into world space and I'm not quite sure is this the right way: MouseMove gives (float fX, float fY) which are viewport coords range (0-1) then I need to rerange this coords into (-1, 1) and then send them into cameras UnProject function which gives me coords from world space. Is this the right way to handle this??

0 Likes

Things are looking good, but still needs some helps. So my goal is to take screen space coords into world space and I'm not quite sure is this the right way: MouseMove gives (float fX, float fY) which are viewport coords range (0-1) then I need to rerange this coords into (-1, 1) and then send them into cameras UnProject function which gives me coords from world space. Is this the right way to handle this??

Message 8 of 13
haikalle2771
in reply to: haikalle2771

haikalle2771
Contributor
Contributor

I was able to figure this out.. no help needed anymore 🙂

0 Likes

I was able to figure this out.. no help needed anymore 🙂

Message 9 of 13
Anonymous
in reply to: haikalle2771

Anonymous
Not applicable

It's great that you figured it out. But it's generally polite to post some code after your question has been answered. So other people can also benefit from it too.

It's really annoying when someone asks for help...gets it...then bails out without sharing any part of the solution with everyone else.

Since these C++ plugins are fairly long in the tooth with framework code. What most people do is post a small snippet of C++ code rather than the entire plugin code.

In this case. It would be good netiquette if you posted your screen space-to-world space code. Or whatever feel that you can.

 

Thanks,

-ScottA

0 Likes

It's great that you figured it out. But it's generally polite to post some code after your question has been answered. So other people can also benefit from it too.

It's really annoying when someone asks for help...gets it...then bails out without sharing any part of the solution with everyone else.

Since these C++ plugins are fairly long in the tooth with framework code. What most people do is post a small snippet of C++ code rather than the entire plugin code.

In this case. It would be good netiquette if you posted your screen space-to-world space code. Or whatever feel that you can.

 

Thanks,

-ScottA

Message 10 of 13
haikalle2771
in reply to: Anonymous

haikalle2771
Contributor
Contributor

Hi!. The reason why I don't show my code is that I'm from Finland and my code includes a lot of finnish word so it could be quite hard others to use that. But I hope that the goal I had in previous post I got it to work so the main steps are there to anyone to follow and I'm glad to help anybody if they need futher help.

0 Likes

Hi!. The reason why I don't show my code is that I'm from Finland and my code includes a lot of finnish word so it could be quite hard others to use that. But I hope that the goal I had in previous post I got it to work so the main steps are there to anyone to follow and I'm glad to help anybody if they need futher help.

Message 11 of 13
Anonymous
in reply to: haikalle2771

Anonymous
Not applicable

"I'm glad to help anybody if they need futher help"

 

That's great. Because I need further help. 😉

I would like to see how you handled the screen to world conversions.

It's easy to translate Finnish to English. So that's not a problem.

Can you please post your source code in your other thread along with the Sketch.mp file?

 

Thanks,

-ScottA

0 Likes

"I'm glad to help anybody if they need futher help"

 

That's great. Because I need further help. 😉

I would like to see how you handled the screen to world conversions.

It's easy to translate Finnish to English. So that's not a problem.

Can you please post your source code in your other thread along with the Sketch.mp file?

 

Thanks,

-ScottA

Message 12 of 13
haikalle2771
in reply to: Anonymous

haikalle2771
Contributor
Contributor
void CurveCreator::MouseMove( float fX, float fY, float fXDelta, float fYDelta , AxisAlignedBoundingBox &a, float )
{
	// determine where the user clicked in 3d space
	Vector normal,zero,v_up,v_right,pV1,pV2,planeN,v_position,distance,nn,oli;

	zero.Set(0, 0, 0);
	v_position = Kernel()->Scene()->ActiveCamera()->Forward();
	float tulos = m_fSTimes.m_cValue;
	v_position.SetLength(tulos);
	distance = v_position - zero;
	float matka = distance.Length();
	distance.SetLength(matka*0.9f);

	nn = distance;
	nn.Normalize();
	
	v_up = Kernel()->Scene()->ActiveCamera()->Up();
	v_right = Kernel()->Scene()->ActiveCamera()->Right();
	pV1 = v_up - distance;
	pV2 = v_right - distance;
	planeN = pV2 & pV1;
	planeN.Normalize();

	normal = nn;

	float xnew, ynew, tValue;
	xnew = fX - 1 + 2 * fX*0.5f;
	ynew = 1 - fY - 2 * fY*0.5f;
	Vector newCoord,newVec,CamVec,ShootVec,final;
	newCoord.Set(xnew, ynew, 0.0f);
	newVec = Kernel()->Scene()->ActiveCamera()->UnProject(newCoord);
	CamVec = Kernel()->Scene()->ActiveCamera()->Position();
	
	ShootVec = newVec - CamVec;

	// calc t constant value for vector and plane

	tValue = ((normal.m_fX*distance.m_fX) + (normal.m_fY*distance.m_fY) + (normal.m_fZ*distance.m_fZ)-(CamVec.m_fX * normal.m_fX)-(CamVec.m_fY*normal.m_fY)-(CamVec.m_fZ*normal.m_fZ) )/ ((ShootVec.m_fX*normal.m_fX)+ (ShootVec.m_fY*normal.m_fY)+ (ShootVec.m_fZ*normal.m_fZ));

	// calc intersection of the line and plane
	final.m_fX = CamVec.m_fX + ShootVec.m_fX * tValue;
	final.m_fY = CamVec.m_fY + ShootVec.m_fY * tValue;
	final.m_fZ = CamVec.m_fZ + ShootVec.m_fZ * tValue;

Hi! Here is the code I have used to change screen space into world space. 

0 Likes

void CurveCreator::MouseMove( float fX, float fY, float fXDelta, float fYDelta , AxisAlignedBoundingBox &a, float )
{
	// determine where the user clicked in 3d space
	Vector normal,zero,v_up,v_right,pV1,pV2,planeN,v_position,distance,nn,oli;

	zero.Set(0, 0, 0);
	v_position = Kernel()->Scene()->ActiveCamera()->Forward();
	float tulos = m_fSTimes.m_cValue;
	v_position.SetLength(tulos);
	distance = v_position - zero;
	float matka = distance.Length();
	distance.SetLength(matka*0.9f);

	nn = distance;
	nn.Normalize();
	
	v_up = Kernel()->Scene()->ActiveCamera()->Up();
	v_right = Kernel()->Scene()->ActiveCamera()->Right();
	pV1 = v_up - distance;
	pV2 = v_right - distance;
	planeN = pV2 & pV1;
	planeN.Normalize();

	normal = nn;

	float xnew, ynew, tValue;
	xnew = fX - 1 + 2 * fX*0.5f;
	ynew = 1 - fY - 2 * fY*0.5f;
	Vector newCoord,newVec,CamVec,ShootVec,final;
	newCoord.Set(xnew, ynew, 0.0f);
	newVec = Kernel()->Scene()->ActiveCamera()->UnProject(newCoord);
	CamVec = Kernel()->Scene()->ActiveCamera()->Position();
	
	ShootVec = newVec - CamVec;

	// calc t constant value for vector and plane

	tValue = ((normal.m_fX*distance.m_fX) + (normal.m_fY*distance.m_fY) + (normal.m_fZ*distance.m_fZ)-(CamVec.m_fX * normal.m_fX)-(CamVec.m_fY*normal.m_fY)-(CamVec.m_fZ*normal.m_fZ) )/ ((ShootVec.m_fX*normal.m_fX)+ (ShootVec.m_fY*normal.m_fY)+ (ShootVec.m_fZ*normal.m_fZ));

	// calc intersection of the line and plane
	final.m_fX = CamVec.m_fX + ShootVec.m_fX * tValue;
	final.m_fY = CamVec.m_fY + ShootVec.m_fY * tValue;
	final.m_fZ = CamVec.m_fZ + ShootVec.m_fZ * tValue;

Hi! Here is the code I have used to change screen space into world space. 

Message 13 of 13
Anonymous
in reply to: haikalle2771

Anonymous
Not applicable

Thank You!

 

-ScottA

0 Likes

Thank You!

 

-ScottA

Can't find what you're looking for? Ask the community or share your knowledge.

Post to forums  

Autodesk Design & Make Report