Exemplo n.º 1
0
NxFluidEmitter* CreateFluidEmitter(const NxReal dimX, const NxReal dimY)
{
	fluid = CreateFluid();
	assert(fluid);

	NxQuat q;
	q.fromAngleAxis(90,NxVec3(1,0,0));
	NxMat34 mat;
	mat.M.fromQuat(q);
	mat.t = NxVec3(0,4.5,0);
	// Create emitter
	NxFluidEmitterDesc emitterDesc;
	emitterDesc.setToDefault();
	emitterDesc.frameShape = NULL;
	emitterDesc.dimensionX = dimX;
	emitterDesc.dimensionY = dimY;
	emitterDesc.relPose = mat;
	emitterDesc.rate = 100;
	emitterDesc.randomAngle = 0.0f;
	emitterDesc.randomPos = NxVec3(0.0f,0.0f,0.0f);
	emitterDesc.fluidVelocityMagnitude = 2.5f;
	emitterDesc.repulsionCoefficient = 0.02f;
	emitterDesc.maxParticles = 0;
	emitterDesc.particleLifetime = 0.0f;
	emitterDesc.type = NX_FE_CONSTANT_PRESSURE;
	emitterDesc.shape = NX_FE_ELLIPSE;
	return fluid->createEmitter(emitterDesc);
}
Exemplo n.º 2
0
pFluidEmitter*pFluid::createEmitter(const pFluidEmitterDesc& desc)
{

	NxFluidEmitterDesc eDesc ;
	eDesc.setToDefault();

	pFactory::Instance()->copyToEmitterDesc(eDesc,desc);

	int valid = eDesc.isValid();
	if (!valid)
	{
		xLogger::xLog(XL_START,ELOGERROR,E_LI_MANAGER,"Emitter Description not Valid !");
		return NULL;
	}

	CK3dEntity*entityReference = (CK3dEntity*)ctx()->GetObject(desc.entityReference);
	if (!entityReference)
	{
		xLogger::xLog(XL_START,ELOGERROR,E_LI_MANAGER,"You must set a reference object ID in .referenceEntity");
		return NULL;
	}


	eDesc.relPose.M.id();
	eDesc.relPose.M.rotX(-NxHalfPiF32);
	eDesc.relPose.t = NxVec3(0,1.1f,0);

	////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////

	NxFluidEmitter *emitter   = getFluid()->createEmitter(eDesc);

	if (!emitter)
		return NULL;
	
	pFluidEmitter * result  = new pFluidEmitter();
	result->setEmitter(emitter);
	result->setFluid(this);
	result->setEntityReference(entityReference->GetID());
	VxVector pos;
	if (desc.frameShape)
	{
		desc.frameShape->GetPosition(&pos);
	}
	emitter->setGlobalPosition(getFrom(pos));
	emitter->userData = result;

	//////////////////////////////////////////////////////////////////////////
	//
	//		Render Settings    :  
	//

	pFluidRenderSettings *rSettings  =  new pFluidRenderSettings(ctx(),desc.entityReference,"pFluidEmitter");
	rSettings->setToDefault();
	rSettings->setEmitter(result);

	return result;
	
}
Exemplo n.º 3
0
void SampleVortex::createFluid()
{
	static NxVec3 ParticleBuffer[10000];
	
	// Set structure to pass particles, and receive them after every simulation step
	NxParticleData particles;
	//particles.maxParticles			= gParticleBufferCap;
	particles.numParticlesPtr		= &m_ParticleBufferSize;
	particles.bufferPos				= &ParticleBuffer[0].x;
	particles.bufferPosByteStride	= sizeof(NxVec3);

	// Create a fluid descriptor
	NxFluidDesc fluidDesc;
    fluidDesc.maxParticles                  = 5000;
    fluidDesc.kernelRadiusMultiplier		= 1.2;
    fluidDesc.restParticlesPerMeter			= 10;
	fluidDesc.motionLimitMultiplier			= 3.6;
	fluidDesc.packetSizeMultiplier			= 16;
	fluidDesc.collisionDistanceMultiplier	= 0.12;
    fluidDesc.stiffness						= 20;
    fluidDesc.viscosity						= 6;
	fluidDesc.restDensity					= 50;
    fluidDesc.damping						= 0;
	fluidDesc.restitutionForStaticShapes	= 0.4;
	fluidDesc.dynamicFrictionForStaticShapes= 0.03;
	fluidDesc.simulationMethod				= NX_F_SPH; //NX_F_NO_PARTICLE_INTERACTION;
	fluidDesc.flags						   &= ~NX_FF_HARDWARE;

	fluidDesc.initialParticleData			= particles;
	fluidDesc.particlesWriteData			= particles;

	NxFluid* fluid = m_scene->createFluid(fluidDesc);
	assert(fluid != NULL);

	//Setup structure which wraps the buffers for particle creation.
	ParticleSDK* newParticles = new ParticleSDK[5000];

	NxParticleData newParticleData;
	newParticleData.numParticlesPtr			= new NxU32;
	newParticleData.bufferPos				= &newParticles[0].position.x;
	newParticleData.bufferPosByteStride		= sizeof(ParticleSDK);
	newParticleData.bufferVel				= &newParticles[0].velocity.x;
	newParticleData.bufferVelByteStride		= sizeof(ParticleSDK);
	newParticleData.bufferLife				= &newParticles[0].lifetime;
	newParticleData.bufferLifeByteStride	= sizeof(ParticleSDK);

	fluid->setParticlesWriteData(newParticleData);


	// create Emitter
	NxFluidEmitterDesc emitterDesc;
	emitterDesc.dimensionX	= 0.05;
	emitterDesc.dimensionY	= 0.05;
	emitterDesc.shape		= NX_FE_ELLIPSE;
	emitterDesc.maxParticles = 5000;
	emitterDesc.type		= NX_FE_CONSTANT_FLOW_RATE;
	emitterDesc.randomPos	= NxVec3(0.05f, 0.05f, 0.05f);
	emitterDesc.randomAngle = 0.481710941f;
	emitterDesc.fluidVelocityMagnitude = 5;
	emitterDesc.rate		= 50;
	emitterDesc.particleLifetime = 7;
	emitterDesc.repulsionCoefficient = 1;
	emitterDesc.flags		= NX_FEF_VISUALIZATION | NX_FEF_ADD_BODY_VELOCITY | NX_FEF_ENABLED;

	assert(emitterDesc.isValid());

	NxFluidEmitter* emitter = fluid->createEmitter(emitterDesc);
	assert(emitter);
}