射线与球相交的判断

如下图:

设射线原点是A,射线方向的单位向量是B。

点P在射线上的表示形式是:

P(t)=A + tB               

再设球的原点是C,半径是R,如果点P在球面上,则有:

|P(t)-C|^{2} = R^{2}

把 P(t)=A+tB代入上式得:

|A + tB -C|^{2}=R^{2}

因为A和C是固定的两点,把A-C=D,即得

|D + tB|^{2}=R^{2}

然后解方程如下图:

我定定义t0是近点,t1是远点,返回t0代入P(t)就是我们要求的点,代码如下:

bool Hit(const Ray& ray, float& t0, float& t1) const
{
	glm::vec3 oc = ray.mOrig - m_position;
	float a = glm::dot(ray.mDirection, ray.mDirection);
	//一般a是1
	float b = 2.0f * glm::dot(oc, ray.mDirection);
	float c = glm::dot(oc, oc) - mRadius * mRadius;
	float discriminant = b * b - 4 * a * c;

	if (discriminant < 0)
	{
		return false;
	}
	else
	{
		float discriminantK = sqrt(discriminant);
		t0 =  (-b - discriminantK) / (2.0f * a);
		t1 = (-b + discriminantK) / (2.0f * a);

		if (t0 < 0)
		{
			t0 = t1;
		}
	}

	return true;
}

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值