Jump to content

  • Log In with Google      Sign In   
  • Create Account

Banner advertising on our site currently available from just $5!

1. Learn about the promo. 2. Sign up for GDNet+. 3. Set up your advert!


Member Since 31 Jan 2010
Offline Last Active Jul 10 2014 05:24 PM

Posts I've Made

In Topic: HLSL - Billboarding a mesh

04 March 2014 - 05:45 PM

Try to do so:


Get the transpose(float3x3(your WorldViewMatrix));

Get your mesh in local space, multiple him on this ^

And than multiple him as simple, no billboarded mesh;


and try to set culling mode off


I'm not quite following your description, sorry... but maybe this is going back to what you're referring to.. this and showing both sides of the mesh, I do get fairly close..

	// billboard?
		matrix worldViewMat = mul( worldMatrixInstance, viewMatrix );
		output.position = skinnedPos + float4( worldViewMat._41, worldViewMat._42, worldViewMat._43, 1.0f );
	output.position = mul( output.position, projectionMatrix ); 

But as you can see, while the distance of the camera is accounted for fine.. the proper translation doesn't happen when the camera rotates on axes..




What's the reason for this?

In Topic: HLSL - Billboarding a mesh

25 February 2014 - 01:40 PM


Why would that accomplish not rotating it?

Because it undoes the rotation applied by the camera…


My new idea was to try making a billboarding view matrix which does the translation based on the real camera rotations, but for the rotation part of the view matrix, uses the inverse matrices.

Why don’t you just quickly make the WBP (world-billboard-projection) matrix and be done with all that ridiculous math?
XMMATRIX mBillboard;
XMMatrixInverse( &mBillboard, m_matView ); // m_matView is the inverse of another matrix, so instead of inverting it again you could just copy that matrix.
// Only keep the upper-left 3×3.
mBillboard._41 = mBillboard._42 = mBillboard._43 = 0.0f;  // Billboard matrix complete.

XMMATRIX mBillboardView = mBillboard * m_matView; // Can be used instead of the view matrix.
XMMATRIX mBillboardViewProjection = mBillboardView * m_matProj; // Can be used instead of the view-projection matrix.
Why make it so complicated?

L. Spiro



The reason it's all spread out is that it's not working yet, and this way I can experiment with changing individual elements.


I have tried everything suggested in this thread and it's still not working.  Using your suggested method in the above quote, the mesh simply doesn't appear at all, the same as most other attempts..


Still the closest I've gotten is using the inverses of the rotation matrices, but the vertices translate all over the place in this case.. as shown in the video i linked.

In Topic: HLSL - Billboarding a mesh

18 February 2014 - 02:22 PM

My new idea was to try making a billboarding view matrix which does the translation based on the real camera rotations, but for the rotation part of the view matrix, uses the inverse matrices.


This results in ALMOST the correct result.. the mesh now stays 'camera facing' no matter what the camera is doing, however the translation seems to put it all over the place.  I'm wondering how this can be when the translation is the same as when not billboarding:




What adjustment can I make to keep the translation correct?

void CCamera::transform( float x, float y, float z, float fOrientation )
	XMMATRIX matRotationX = XMMatrixRotationX( m_Pitch );
	XMMATRIX matRotationY = XMMatrixRotationY( XMConvertToRadians( fOrientation  * 360.0f ) + m_Yaw );
	XMVECTOR unitVec = XMVectorSet( 0.0f, m_Height, -m_Distance, 0.0f );
	XMVECTOR transVec = XMVector3TransformCoord( unitVec, matRotationX * matRotationY );

	m_posX = x + XMVectorGetX( transVec );
	m_posY = y + XMVectorGetY( transVec );
	m_posZ = z + XMVectorGetZ( transVec );

	XMMATRIX matTranslation = XMMatrixTranslation( m_posX, m_posY, m_posZ );
	XMVECTOR matInvDeter;
	XMMATRIX matInverse = XMMatrixInverse( &matInvDeter, matRotationX * matRotationY );
	XMMATRIX matTransInverse = XMMatrixInverse( &matInvDeter, matTranslation );

	// Billboard version
	XMVECTOR matRotBillboardDeter;
	XMMATRIX matRotationXBillboard = XMMatrixInverse( &matRotBillboardDeter, matRotationX );
	XMMATRIX matRotationYBillboard = XMMatrixInverse( &matRotBillboardDeter, matRotationY );
	XMMATRIX matInverseBillboard = XMMatrixInverse( &matInvDeterBillboard, matRotationXBillboard * matRotationYBillboard );
	XMStoreFloat4x4( &m_matView, matTransInverse * matInverse );
	XMStoreFloat4x4( &m_matBillboard, matTransInverse * matInverseBillboard );
	XMStoreFloat4x4( &m_matRotationX, matRotationX );
	XMStoreFloat4x4( &m_matRotationY, matRotationY );
	XMStoreFloat4x4( &m_matTranslation, matTranslation );


In Topic: HLSL - Billboarding a mesh

17 February 2014 - 01:06 AM

To billboard an object you are supposed to multiply it by the camera matrix, not the view matrix.  The view matrix is the inverse of the camera matrix and it is what you send in an MVP (model-view-projection) matrix.

You should not be manually adjusting positions etc.  It’s nothing more than a single matrix multiply.


Why would that accomplish not rotating it?

In Topic: HLSL - Billboarding a mesh

12 February 2014 - 02:57 PM

        now we TRANSLATE our triangle from Object space to World space ONLY translate no rotations (and this is the bilboarding)



Isn't the line:


float3 position = input.position + float3( boneWorldViewMatrix._41, boneWorldViewMatrix._42, boneWorldViewMatrix._43 );


supposed to do exactly that?  adjust by the translation only..