当前位置: 首页>>代码示例>>C++>>正文


C++ Ray::SetRay方法代码示例

本文整理汇总了C++中Ray::SetRay方法的典型用法代码示例。如果您正苦于以下问题:C++ Ray::SetRay方法的具体用法?C++ Ray::SetRay怎么用?C++ Ray::SetRay使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在Ray的用法示例。


在下文中一共展示了Ray::SetRay方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。

示例1: DoRayTrace

void RayTracer::DoRayTrace( Scene* pScene )
{
	Camera* cam = pScene->GetSceneCamera();
	
	Vector3 camRightVector = cam->GetRightVector();
	Vector3 camUpVector = cam->GetUpVector();
	Vector3 camViewVector = cam->GetViewVector();
	Vector3 centre = cam->GetViewCentre();
	Vector3 camPosition = cam->GetPosition();

	double sceneWidth = pScene->GetSceneWidth();
	double sceneHeight = pScene->GetSceneHeight();

	// Orthographic
	//double pixelDX = (sceneWidth / m_buffWidth) * 15;
	//double pixelDY = (sceneHeight / m_buffHeight) * 15;

	// Perspective - uncomment code in scene too
	double pixelDX = sceneWidth / m_buffWidth;
	double pixelDY = sceneHeight / m_buffHeight;
	
	int total = m_buffHeight*m_buffWidth;
	int done_count = 0;
	
	Vector3 start;

	start[0] = centre[0] - ((sceneWidth * camRightVector[0])
		+ (sceneHeight * camUpVector[0])) / 2.0;
	start[1] = centre[1] - ((sceneWidth * camRightVector[1])
		+ (sceneHeight * camUpVector[1])) / 2.0;
	start[2] = centre[2] - ((sceneWidth * camRightVector[2])
		+ (sceneHeight * camUpVector[2])) / 2.0;
	
	Colour scenebg = pScene->GetBackgroundColour();

	if (m_renderCount == 0)
	{
		fprintf(stdout, "Trace start.\n");

		glClearColor(0.0, 0.0, 0.0, 0.0);
		glClear(GL_COLOR_BUFFER_BIT);

		for (int i = 0; i < m_buffHeight; i++) {
			for (int j = 0; j < m_buffWidth; j++) {
				//calculate the metric size of a pixel in the view plane (e.g. framebuffer)
				Vector3 pixel;

				Colour colour;

				// Anti-Aliasing WOOHOO - 16 total samples per pixel
				for (float x = 0.25f; x <= 1.f; x += 0.25f)
				{
					for (float y = 0.25; y <= 1.f; y += 0.25f)
					{
						pixel[0] = start[0] + (i + x) * camUpVector[0] * pixelDY
							+ (j + y) * camRightVector[0] * pixelDX;
						pixel[1] = start[1] + (i + x) * camUpVector[1] * pixelDY
							+ (j + y) * camRightVector[1] * pixelDX;
						pixel[2] = start[2] + (i + x) * camUpVector[2] * pixelDY
							+ (j + y) * camRightVector[2] * pixelDX;

						/*
						* setup view ray
						* In perspective projection, each view ray originates from the eye (camera) position
						* and pierces through a pixel in the view plane
						*
						* TODO: For a little extra credit, set up the view rays to produce orthographic projection
						*/


						// PERSPECTIVE
						Ray viewray;
						viewray.SetRay(camPosition, (pixel - camPosition).Normalise());


						// Orthographic attempt
						//viewray.SetRay(pixel, camViewVector.Normalise());

						m_isReflecting = m_isRefracting = false;

						//trace the scene using the view ray
						//the default colour is the background colour, unless something is hit along the way
						colour+= this->TraceScene(pScene, viewray, scenebg, m_traceLevel);
					}
				}

				colour.red /= 16.f;
				colour.green /= 16.f;
				colour.blue /= 16.f;

				/*
				* The only OpenGL code we need
				* Draw the pixel as a coloured rectangle
				*/
				glColor3f(colour.red, colour.green, colour.blue);
				glRecti(j, i, j + 1, i + 1);
			}
			glFlush();
		}

//.........这里部分代码省略.........
开发者ID:wyrover,项目名称:RayTracer,代码行数:101,代码来源:RayTracer.cpp

示例2: TraceScene

Colour RayTracer::TraceScene(Scene* pScene, Ray& ray, Colour incolour, int tracelevel, bool shadowray)
{
	RayHitResult result;
	Colour outcolour = incolour;
	Colour reflectColour;
	Colour refractColour;

	std::vector<Light*>* light_list = pScene->GetLightList();

	if (tracelevel <= 0) // reach the MAX depth of the recursion.
	{
		return outcolour;
	}

	result = pScene->IntersectByRay(ray, shadowray);

	if (result.data) //the ray has hit something
	{

		Vector3 start = ray.GetRayStart();

		if (!shadowray)
		{
			outcolour = CalculateLighting(light_list,&start, &result);
		}
		else
		{
			return outcolour * 0.3f;
		}


		if(m_traceflag & TRACE_REFLECTION)
		{
			//Only consider reflection for spheres and boxes
			if (((Primitive*)result.data)->m_primtype == Primitive::PRIMTYPE_Sphere || ((Primitive*)result.data)->m_primtype == Primitive::PRIMTYPE_Box)
			{
				//TODO: Calculate reflection ray based on the current intersection result
				//Recursively call TraceScene with the reflection ray
				//Combine the returned colour with the current surface colour 

				// DONE
				m_isReflecting = true;

				ray.SetRay(result.point, ray.GetRay().Reflect(result.normal));
				outcolour *= TraceScene(pScene, ray, outcolour, --tracelevel, shadowray);
			}
		}

		if (m_traceflag & TRACE_REFRACTION)
		{
			//Only consider refraction for spheres and boxes
			if (((Primitive*)result.data)->m_primtype == Primitive::PRIMTYPE_Sphere || ((Primitive*)result.data)->m_primtype == Primitive::PRIMTYPE_Box)
			{
				//TODO: Calculate refraction ray based on the current intersection result
				//Recursively call TraceScene with the reflection ray
				//Combine the returned colour with the current surface colour

				// DONE

				double refractionIndex = 1;

				// Better refraction that using a constant
				if (m_isRefracting)
				{
					refractionIndex = ((Primitive*)result.data)->GetMaterial()->GetRefractiveIndex() / AIR_REFRACTIVE_INDEX;
				}
				else
				{
					refractionIndex = AIR_REFRACTIVE_INDEX / ((Primitive*)result.data)->GetMaterial()->GetRefractiveIndex();
				}
				m_isRefracting = true;

				ray.SetRay(result.point + (result.normal * -0.0001), ray.GetRay().Refract((result.normal), 1));
				outcolour += TraceScene(pScene, ray, outcolour, --tracelevel, shadowray) * ((Primitive*)result.data)->GetMaterial()->GetTransparency();
			}
		}
		
		//Check if this is in shadow
		if ( m_traceflag & TRACE_SHADOW )
		{
			std::vector<Light*>::iterator lit_iter = light_list->begin();
			while (lit_iter != light_list->end())
			{
				//TODO: Calculate the shadow ray using the current intersection result and the light position
				//Recursively call TraceScene with the shadow ray

				// DONE

				Vector3 l_normal = ((*lit_iter)->GetLightPosition() - result.point).Normalise();
				Vector3 l = result.point + (l_normal * 0.0001);
				ray.SetRay(l, l_normal);

				outcolour = TraceScene(pScene, ray, outcolour, --tracelevel, true);

				lit_iter++;
			}
		}
	}
	return outcolour;
}
开发者ID:wyrover,项目名称:RayTracer,代码行数:100,代码来源:RayTracer.cpp


注:本文中的Ray::SetRay方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。