求助,如何滑动屏幕 控制物体旋转

如上图的效果

第一次接触3d的东西,方向搞不太清楚
一开始想的简单了用
想用 touch_move 实现差值x 和y进行x y的旋转,到了后面才发现少了一个z
callback(EventTouch){
let ch = EventTouch.getDelta();
this.testNode.setRotationFromEuler(angle.x - ch.y,angle.y + ch.x,0);
}
查阅了unity相关的资料(刚入行写过几个月unity现在全忘了),发现unity有帖子说过这个功能如下
示例代码:
private bool onDrag = false; //是否被拖拽//
public float speed = 6f; //旋转速度//
private float tempSpeed; //阻尼速度//
private float axisX = 1;
//鼠标沿水平方向移动的增量//
private float axisY = 1; //鼠标沿竖直方向移动的增量//
private float cXY;
void OnMouseDown()
{
//接受鼠标按下的事件//

	axisX = 0f; axisY = 0f;
}
void OnMouseDrag()     //鼠标拖拽时的操作// 
{
	
	onDrag = true;
	axisX = -Input.GetAxis("moveX");
	//获得鼠标增量// 
	axisY = Input.GetAxis("moveY");
	cXY = Mathf.Sqrt(axisX * axisX + axisY * axisY); //计算鼠标移动的长度//
	if (cXY == 0f) { cXY = 1f; }
	
}
float Rigid()      //计算阻尼速度//    
{
	if (onDrag)
	{
		tempSpeed = speed;
	}
	else
	{
		if (tempSpeed > 0)
		{
			tempSpeed -= speed * 2 * Time.deltaTime / cXY; //通过除以鼠标移动长度实现拖拽越长速度减缓越慢// 
		}
		else { 
			tempSpeed = 0; 
		}
	}
	return tempSpeed;
}

void Update()
{
	// this.transform.Rotate(new Vector3(axisY, axisX, 0) * Rigid(), Space.World); //这个是是按照之前方向一直慢速旋转
	if (!Input.GetMouseButton(0))
	{ 
		onDrag = false;
		this.transform.Rotate(new Vector3(axisY, axisX, 0)*0.5f, Space.World); 
	}
}

想了一下午没有试出来,还查了一下资料 发现貌似creator 3d中rotate()这个函数可以实现,但是四元数不知道如何取值

所以想请教各路大神,如何实现方法或者思路

1赞

突然发现,上面的unity代码也不行,好像也没有考虑z轴的旋转

有没有大佬给解答

ccc3d是否有中心旋转的接口?

你可以用 eulerAngle 来实现你要的旋转,事件可以通过

https://docs.cocos.com/creator3d/manual/zh/engine/event/?h=touch

我的事件用的是touch_move获取 EventTouch.getDelta(); 的x,y

eulerAngle这个函数如何使用

刚才写了一下,貌似还是不是我想要的效果,不知是不是我写法的问题
callback(EventTouch){

    let ch = EventTouch.getDelta();
    let angle = this.testNode.eulerAngles;
    this.testNode.eulerAngles = new Vec3(angle.x - ch.y,angle.y + ch.x,0);
}

这种写法会出现,无法正确旋转方向

就是这样,当我旋转一个角度时 再向上滑动 旋转效果不对

好像,不管怎么样,横向滑动 控制y轴都是对的

经过不懈努力终于找到实现的方法了
代码参考
onLoad(){
this.lab.on(Node.EventType.TOUCH_MOVE, this.callback, this);
}
callback(EventTouch){
let dif = EventTouch.getDelta();
let q_tmp = new Quat();
let v_tmp = new Vec3(-dif.y, dif.x, 0);
v_tmp.normalize();
let out_Q = Quat.rotateAround(q_tmp, this.testNode.rotation, v_tmp, Math.PI * 0.01);
this.testNode.setRotation(out_Q.x, out_Q.y, out_Q.z, out_Q.w);
}

1赞

大兄弟你是怎么找到实现方法的呀

找各种帖子,然后结合一下试出来的.我不管找creator的,我找unity的

666 6翻天

赞赞赞赞赞赞

我用的Cocoscreator, 不是3D那个,提醒一下
v_tmp需要归一化向量,所以上面的normalize要换成normalizeSelf
否则模型会有形变

不错,我后面发现了这个问题忘记更新上来了。谢谢提醒

你好 ,能提供一份Demo吗

哈喽 ,能提供一份Demo吗

demo? 上面解决方案都写得挺清楚了